Microsoft डॉक्स के अनुसार, स्थानिक भूगोल के साथ निम्नलिखित तरीकों पर भूगोल प्रकारों का उपयोग किया जाएगा जब वे एक तुलना की शुरुआत में एक WHERE
क्लॉज के साथ भविष्यवाणी करते हैं :
STIntersects
STDistance
STEquals
केवल ज्यामिति प्रकार के तरीके (प्रतिबंधित सूची) में स्थानिक सूचकांक के उपयोग को ट्रिगर किया जाएगा JOIN ... ON
, इसलिए उपयोग करने के लिए अपने कोड को बदलें WHERE geog1.STIntersects(geog2) = 1
और इससे गति में सुधार होना चाहिए।
मैं g2server के उत्तर में सलाह लेने की भी सलाह देता हूं और फ़िल्टर करने के लिए निम्नलिखित जोड़ें और उस पर स्थानिक सूचकांक जोड़ें
ALTER TABLE [dbo].[T_POLYGON] ADD SimplePolysGeog AS
([geography]::STGeomFromWKB([geometry]::STGeomFromWKB([COORD].[STAsBinary](),
[COORD].[STSrid])
.STEnvelope().STAsBinary(),(4326))) PERSISTED
फिर आप निम्नलिखित की तरह एक क्वेरी कर सकते हैं (मैंने इस पोस्ट को जल्दी से लिखा है और अभी तक परीक्षण नहीं किया है, यह सिर्फ कोशिश करने के लिए कुछ है क्योंकि मैंने देखा कि आपकी क्वेरी और उच्चतम पोस्ट किए गए उत्तर का उपयोग करें पर स्थानिक ऑप = 1 का उपयोग करें जो कि एक का उपयोग नहीं करेगा स्थानिक सूचकांक):
SELECT
(SELECT p2.polygon_id
FROM T_Polygon p2
WHERE p2.coords.STIntersects(t.coords) = 1),
t.pin_id
FROM T_PIN t
WHERE
(SELECT t.coords.STIntersects(p.coords)
FROM T_POLYGON p
WHERE t.coords.STIntersects(p.SimplePolysGeog) = 1) = 1
FYI करें: यदि SimplePolysGeog
ओवरलैपिंग समाप्त नहीं होती है तो ऊपर काम नहीं करता है (जैसे कि एक पिन दो सरलीकृत जियोगे में हो सकता है, बस इसे एक राज्य में लोगों के लिए प्रचलित तरीके से चलाया जाता है और चूंकि सामान्य पोल शेयर सीमा होती है, इसलिए बाउंडिंग बॉक्स ओवरलैप हो जाते हैं), इसलिए अधिकांश उपयोग में मामलों में, यह एक त्रुटि फेंक देगा कि उपशम एक से अधिक परिणाम लौटाए।
एमएस डॉक्स से स्थानिक सूचकांक अवलोकन :
स्थानिक सूचियों द्वारा समर्थित भूगोल विधियाँ
कुछ शर्तों के तहत, स्थानिक सूचकांक निम्नलिखित सेट-उन्मुख भूगोल विधियों का समर्थन करते हैं: STIntersects (), STEquals (), और STDistance ()। स्थानिक सूचकांक द्वारा समर्थित होने के लिए, इन विधियों का उपयोग किसी क्वेरी के WHERE क्लॉज़ के भीतर किया जाना चाहिए, और उन्हें निम्न सामान्य रूप के एक विधेय के भीतर होना चाहिए:
geography1.method_name (geography2) comparison_operatorvalid_number
गैर-शून्य परिणाम वापस करने के लिए, भूगोल 1 और भूगोल 2 में समान स्थानिक संदर्भ पहचानकर्ता (SRID) होना चाहिए । अन्यथा, विधि NULL देता है।
स्थानिक सूचकांक निम्नलिखित विधेय रूपों का समर्थन करते हैं:
क्वेरीज़ जो स्थानिक अनुक्रमित का उपयोग करती हैं
स्थानिक इंडेक्स केवल उन प्रश्नों में समर्थित होते हैं जिनमें WHERE क्लॉज में एक अनुक्रमित स्थानिक ऑपरेटर शामिल होता है। उदाहरण के लिए वाक्य रचना जैसे:
[spatial object].SpatialMethod([reference spatial object]) [ = | < ] [const literal or variable]
क्वेरी ऑप्टिमाइज़र स्थानिक संचालन (कि @a.STIntersects(@b) = @b.STInterestcs(@a)
) की कम्यूटिटी को समझता है । हालांकि, स्थानिक सूचकांक का उपयोग नहीं किया जाएगा यदि तुलना की शुरुआत में स्थानिक ऑपरेटर शामिल नहीं है (उदाहरण के WHERE 1 = spatial op
लिए स्थानिक सूचकांक का उपयोग नहीं करेगा)। स्थानिक सूचकांक का उपयोग करने के लिए, तुलना (उदाहरण के लिए WHERE spatial op = 1
) को फिर से लिखें ।
...
SimplePolysGeogs
ओवरलैप होने पर निम्नलिखित क्वेरी काम करेगी :
;WITH cte AS
(
SELECT T_PIN.PIN_ID,
T_POLYGON.POLYGON_ID,
T_POLYGON.COORD
FROM T_PIN
INNER JOIN T_POLYGON
ON T_PIN.COORD.STIntersects(T_POLYGON.SimplePolysGeog) = 1
)
SELECT COUNT(*)
FROM T_PIN
INNER JOIN cte
ON T_PIN_PIN_ID = cte.PIN_ID
where cte.[COORD].STIntersects(T_PIN.COORD) = 1