का उपयोग किए बिना:क्वेरी प्रोसेसर इस क्वेरी में परिभाषित संकेतों के कारण एक क्वेरी प्लान नहीं बना सका। क्वेरी पुनः सबमिट करें और मैं निम्नलिखित चला रहा हूँ सेट FORCEPLAN
DECLARE @g geography;
declare @point nvarchar(50) =''
declare @i int =0,
@lat decimal(8,6) =0.0,
@long decimal(8,6) =0.0,
@start datetime = getdate()
set @lat =(select (0.9 -Rand()*1.8)*100)
set @long =(select (0.9 -Rand()*1.8)*100)
set @point = (select 'POINT('+CONVERT(varchar(10), @lat)+ ' '
+CONVERT(varchar(10), @long)+')')
SET @g = geography::STGeomFromText(@point, 4326);
SELECT TOP 1000
@lat,
@long,
@g.STDistance(st.[coord]) AS [DistanceFromPoint (in meters)]
, st.[coord]
, st.id
FROM Temp st with(index([SpatialIndex_1]))
इस क्वेरी प्रदर्शन काफी खराब रहा है क्योंकि यह spacial सूचकांक का उपयोग नहीं करता, तो मैं with(index([SpatialIndex_1]))
कहा कि यह मजबूर करने के लिए।
भूगोल सूचकांक निम्नलिखित दिखता है:
CREATE SPATIAL INDEX [SpatialIndex_1] ON [dbo].Temp
(
[coord]
)USING GEOGRAPHY_GRID
WITH (GRIDS =(LEVEL_1 = LOW,LEVEL_2 = MEDIUM,LEVEL_3 = LOW,LEVEL_4 = LOW),
CELLS_PER_OBJECT = 16, PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF,
ONLINE = OFF, ALLOW_ROW_LOCKS = OFF, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 95)
ON [PRIMARY]
अब यह मुझे त्रुटि संदेश
संदेश 8622, स्तर 16, राज्य 1, रेखा 15 क्वेरी प्रोसेसर की वजह से एक प्रश्न योजना का उत्पादन नहीं कर सकता है देता है इस क्वेरी में परिभाषित संकेत। कोई संकेत निर्दिष्ट किए बिना और SET FORCEPLAN का उपयोग किए बिना क्वेरी को पुनः सबमिट करें।
मैं पढ़ और समझ सकता हूं कि यह मुझे संकेत हटाने के लिए कहता है, प्रश्न यह संकलन में सफल क्यों होता है लेकिन रन-टाइम पर विफल रहता है? क्या मेरी अनुक्रमणिका में कुछ गड़बड़ है?
स्पेक्ट्रियल इंडेक्स का उपयोग शुरू करने के लिए SQL के लिए मुझे क्या बदलने की आवश्यकता है?
कुछ डेटा उत्पन्न करने के लिए आप निम्न स्क्रिप्ट का उपयोग कर सकते हैं।
CREATE TABLE dbo.Temp
(
Id int NOT NULL IDENTITY (1, 1),
Coord geography NOT NULL
) ON [PRIMARY]
TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE dbo.Temp ADD CONSTRAINT
PK_Temp PRIMARY KEY CLUSTERED
(
Id
)
WITH(STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
GO
declare @i int =0
declare @lat decimal(8,6) =0.0
declare @long decimal(8,6) =0.0
while (@i < 47000)
begin
set @lat =(select (0.9 -Rand()*1.8)*100)
set @long =(select (0.9 -Rand()*1.8)*100)
insert into Temp
select geography::Point(@lat, @long,4326)
set @i [email protected]+1
end
go
CREATE SPATIAL INDEX [SpatialIndex_1] ON [dbo].Temp
(
[coord]
)USING GEOGRAPHY_GRID
WITH (GRIDS =(LEVEL_1 = LOW,LEVEL_2 = MEDIUM,LEVEL_3 = LOW,LEVEL_4 = LOW),
CELLS_PER_OBJECT = 16, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF,
ALLOW_ROW_LOCKS = OFF, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 95)
ON [PRIMARY]
GO
मैं ऑर्डर कर रहा था (बस निकटतम टॉप एक्स चाहता था), लेकिन वहां एसटीडिस्टेंस() के साथ कोई क्लॉज नहीं था; इसे मेरे लिए साफ़ कर दिया। धन्यवाद दोस्त। – radpin