7

का उपयोग किए बिना:क्वेरी प्रोसेसर इस क्वेरी में परिभाषित संकेतों के कारण एक क्वेरी प्लान नहीं बना सका। क्वेरी पुनः सबमिट करें और मैं निम्नलिखित चला रहा हूँ सेट 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 

उत्तर

3
here से

: स्थानिक स्तंभों में से एक और पर

  1. एक स्थानिक सूचकांक मौजूद होना चाहिए:

    निम्न आवश्यकताओं को एक स्थानिक सूचकांक का उपयोग करने के एक निकटतम पड़ोसी क्वेरी के लिए पूरा किया जाना चाहिए STDistance() विधि को उस कॉलम का उपयोग WHERE और ORDER खंडों में करना चाहिए।

  2. शीर्ष खंड में PERCENT कथन शामिल नहीं हो सकता है।
  3. WHERE खंड में एक STDistance() विधि होनी चाहिए।
  4. यदि WHERE खंड में कई भविष्यवाणियां हैं तो एसटीडिस्टेंस() विधि युक्त भविष्यवाणी अन्य भविष्यवाणियों के साथ एक और संयोजन से जुड़ी होनी चाहिए। STDistance() विधि WHERE क्लॉज के वैकल्पिक भाग में नहीं हो सकती है।
  5. ORDER BY खंड में पहली अभिव्यक्ति को STDistance() विधि का उपयोग करना चाहिए।
  6. ORDER BY खंड में पहली एसटीडिस्टेंस() अभिव्यक्ति के लिए सॉर्ट ऑर्डर एएससी होना चाहिए।
  7. सभी पंक्तियां जिनके लिए एसटीडीस्टेंस एनयूएलएल लौटाता है उन्हें फ़िल्टर किया जाना चाहिए।

तो, यह काम करना चाहिए:

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])) 
WHERE @g.STDistance(st.[coord]) IS NOT NULL 
ORDER BY @g.STDistance(st.[coord]) asc 

आप देख सकते हैं कि यह spacial सूचकांक भी WITH INDEX संकेत निकाल दिया जाता है का उपयोग कर रहा है।

+1

मैं ऑर्डर कर रहा था (बस निकटतम टॉप एक्स चाहता था), लेकिन वहां एसटीडिस्टेंस() के साथ कोई क्लॉज नहीं था; इसे मेरे लिए साफ़ कर दिया। धन्यवाद दोस्त। – radpin

संबंधित मुद्दे