आपको स्थानिक सूचकांक का उपयोग कब नहीं करना चाहिए?


29

मैं यह पूछ रहा हूं क्योंकि मैं मुख्य रूप से ओरेकल के साथ काम कर रहा था, लेकिन पिछले एक साल से मैं पोस्टजीआईएस और एसक्यूएसवर ​​2008 के साथ दोहरीकरण कर रहा हूं। ओरेकल में अधिकांश स्थानिक कार्य ओआरए -13226 त्रुटि वापस करने वाले एक स्थानिक सूचकांक के बिना काम नहीं करेंगे:

13226, 00000, "एक स्थानिक सूचकांक के बिना समर्थित इंटरफ़ेस नहीं" // * कारण: ज्यामिति तालिका में स्थानिक सूचकांक नहीं है। // * एक्शन: सत्यापित करें कि स्थानिक ऑपरेटर में संदर्भित ज्यामिति तालिका पर एक स्थानिक सूचकांक है।

मेरे लिए यह समझ में आता है। आप एक स्थानिक क्वेरी चलाते हैं = आपके पास एक स्थानिक सूचकांक होना चाहिए। लेकिन जहां तक ​​मैं समझता हूं, न तो PostGIS SQL सर्व की आवश्यकता नहीं है। पोस्टजीआईएस में भी फ़ंक्शन (_ * उदा _STContains) लगता है कि विशिष्ट स्थानिक सूचकांक का उपयोग नहीं करेगा।

तो सवाल यह है कि क्या ऐसे कोई मामले हैं जहां आपको एक स्थानिक सूचकांक का उपयोग नहीं करना चाहिए? जरूरी नहीं है कि 'इसे ले या छोड़ दो' दृष्टिकोण है, लेकिन इससे कोई फर्क नहीं पड़ेगा, लेकिन जहां स्थानिक सूचकांक का उपयोग नहीं किया जाता है वह प्रदर्शन को बढ़ावा देगा? मेरे लिए, अंतिम वाक्य शब्दों में एक विरोधाभास है लेकिन अन्यथा PostGIS इन कार्यों को क्यों प्रदान करेगा?


3
यदि आप यह देखना चाहते हैं कि कोई सूचकांक PostGIS SET enable_seqscan = बंद में चीजों को धीमा कैसे करता है। यह PostgreSQL को हर बार अनुक्रमित का उपयोग करने के लिए मजबूर करेगा। इसके साथ गति की तुलना करें।
सीन

यह थ्रेड शुरू करने के लिए धन्यवाद। मैं नेट पर जानकारी डाल रहा हूं, यह पता लगाने की कोशिश कर रहा हूं कि मेरा संगठन (सरकार) अपने oracle / sde फीचर कक्षाओं और टेबल पर स्थानिक (या यहां तक ​​कि विशेषता) सूचकांकों का उपयोग क्यों नहीं करता है। अब मेरे पास उन्हें पेश करने के लिए कुछ तर्क हैं इसलिए मुझे अपने बालों को बाहर निकालने की ज़रूरत नहीं है, खुद को हल करने के लिए एक प्रश्न की प्रतीक्षा कर रहे हैं।
माइक

जवाबों:


12

mapoholic,

सामान्यतया, जब तक आप वास्तव में छोटी तालिकाओं के साथ काम नहीं कर रहे हैं, तब तक एक स्थानिक सूचकांक के बिना एक स्थानिक क्वेरी करने का कोई कारण नहीं है। फिर भी आप ST_ का उपयोग करेंगे, जो एक इंडेक्स का उपयोग नहीं करते हैं, लेकिन && इंडेक्सेबल शॉर्ट सर्किट बॉक्स ऑपरेटर हैं। _ST के साथ शुरू होने वाले कार्य अंतिम उपयोगकर्ताओं द्वारा उपयोग किए जाने के लिए नहीं हैं। कारण वे मौजूद हैं क्योंकि उन्हें करना है। PostGIS स्थानिक इंडेक्स एसक्यूएल इनलाइनिंग का उपयोग इंडेक्स के उपयोग को मजबूर करने के लिए करता है - _ST आमतौर पर GEOS द्वारा किया जाता है और &&& इंडेक्स है जो फिर से चालू हो सकता है। तो _ST वास्तव में एक कार्यान्वयन कलाकृति है।

इसलिए संक्षेप में- इसका एक कार्य नहीं है ताकि अधिक तीव्र स्थानिक जांच से पहले एक ही बार में अनुक्रमणिका के संचालन को पुन: व्यवस्थित किया जा सके।


LR1234567 चीयर्स। मुझे लगता है कि यह वही है जिसकी मुझे तलाश थी।
मितोहोलिक जूल 28'11

25

यदि आपका डेटासेट अक्सर जोड़ा और अपडेट किया जाता है, तो INSERT, DELETE और UPDATE स्टेटमेंट्स जो सूचकांक को फिर से बनाते हैं, डेटाबेस को धीमा कर सकते हैं।

थोक आवेषण के लिए, जैसे कि पूरे OSM डेटासेट को एक डेटाबेस में लोड करना, यह सूचकांकों को छोड़ने और उन्हें फिर से बनाने के लिए तेज हो सकता है।

यदि किसी इंडेक्स को अनदेखा करना अधिक कुशल है (उदाहरण के लिए तालिका मेमोरी में लोड होने के लिए पर्याप्त छोटी है), डेटाबेस क्वेरी प्रोसेसर को यह स्वचालित रूप से करना चाहिए।

मैं मुख्य कारण की अपेक्षा करता हूं कि प्रश्नों को एक स्थानिक सूचकांक के बिना चलाने की अनुमति है, जो कि एक सूचकांक का उपयोग करके प्राप्त होने वाले प्रदर्शन लाभों को मापने के लिए है, इसे छोड़ने के बिना।

अंत में यदि आप प्रश्नों और मानचित्र प्रदर्शनों के लिए एक विशाल प्रदर्शन को बढ़ावा देना चाहते हैं, तो आप सिस्टम में एक महत्वपूर्ण क्षण के लिए सूचकांक बनाने में देरी करना चाहते हैं ...


3
(+1) क्या मुझे उस अंतिम टिप्पणी में थोड़ी सी असावधानी का पता चला है? :-)
whuber

बिल्कुल भी नहीं ;-) लेकिन ध्यान से देखते हुए सूचक को छोड़ना / पुनःप्रयोग करना "डेटाबेस परिवर्तन पर एक्स अधिक समय व्यतीत करने" के लिए एक उपयोगी उत्तर है?
जियोग्राफिका

धन्यवाद जियोग्राफिका- और मैं व्हीबर की टिप्पणी से सहमत हूं! ;-) मैं समझता हूँ कि आप स्थानिक सूचकांक तब गिराएंगे / निष्क्रिय करेंगे जब थोक लोडिंग - या इस मामले के लिए सभी सूचकांक, लेकिन आप एक कारण के बारे में नहीं सोच सकते हैं कि आप कभी भी स्थानिक सूचकांक का उपयोग किए बिना एक स्थानिक क्वेरी क्यों करेंगे? यदि कोई तालिका पर्याप्त छोटी है, तो अनुक्रमणिका का उपयोग करने से कोई अंतर नहीं हो सकता है - पर्याप्त रूप से उचित है - लेकिन अनुक्रमणिका का उपयोग न करने का विकल्प चुनने पर। पता नहीं, मुझे लगता है कि मैं PostGIS गैर-स्थानिक-सूचकांक कार्यों के अस्तित्व के साथ और अधिक हैरान हूँ ...
14

2
यदि एक तालिका काफी छोटी है और मेमोरी में फिट होती है, तो एक इंडेक्स का उपयोग यादृच्छिक डिस्क एक्सेस की आवश्यकता होती है जो अनुक्रमिक स्कैन करने की तुलना में अधिक महंगा है। wiki.postgresql.org/wiki/…
सीन

2
@mapoholic - _ST_Contains जब आप मैन्युअल रूप से अपने डेटा की एक prefilter करना पड़ा से बचे जा सकता है, से पहचानने old.nabble.com/...
geographika

10

मुझे लगता है कि यह निहित है, लेकिन मैं एक प्रश्न के लिए एक स्थानिक सूचकांक का उपयोग नहीं करूंगा जब मेरे पास एक गैर-स्थानिक सूचकांक था जो मैं इसके बजाय उपयोग कर सकता था। उदाहरण के लिए, मेरे पास 2,113,450 अंक हैं जो संयुक्त राज्य अमेरिका को एक तालिका में लोड करते हैं। यदि मैं उन सभी बिंदुओं को खींचना चाहता था जो अलास्का राज्य के भीतर थे, तो मैं या तो एक स्थानिक प्रश्न कर सकता था जो अलास्का राज्य की ज्यामिति के खिलाफ तुलना करने के लिए बिंदु ज्यामिति पर GIST सूचकांक का उपयोग करता था, या, मैं बस उपयोग कर सकता था बिंदु डेटा (जो भी अनुक्रमित है) में "State_alpha" फ़ील्ड उन सभी बिंदुओं को वापस करने के लिए है जिनमें "State_alpha" = 'AK' है।

"इस का स्थानिक हिस्सा कहाँ है", आप पूछते हैं? खैर, अगर मुझे उन्हें इकट्ठा करने के बाद अलास्का_पॉइंट्स पर कुछ और स्थानिक विश्लेषण करने की आवश्यकता है, तो पहले एक गैर-स्थानिक क्वेरी का उपयोग करके उन बिंदु ज्यामितीयों को इकट्ठा करना तेज़ है। इसका यह भी अर्थ है कि वास्तव में बड़े डेटा सेट के लिए, आपको लुकअप फ़ील्ड (या तालिका) जोड़ने से लाभ होता है। फिर से, मुझे पता है कि यह संभवतः सभी के लिए स्पष्ट है, मैं केवल इसका उल्लेख करता हूं क्योंकि मैंने अतीत में इसका सामना वैश्विक डेटा सेटों के साथ किया था जो केवल स्थानिक रूप से अनुक्रमित थे, और जहां एक सामान्य क्वेरी "एक देश के भीतर सभी सुविधाएँ" थी। हमने अनुक्रमणित देश_फिप्स फ़ील्ड को जोड़कर प्रदर्शन का एक बहुत कुछ प्राप्त किया।

नीचे दिए गए उदाहरण से कुछ परिणाम देखें जो इस बात को साबित करते हैं। (नोट: मैंने BBOX क्वेरी का उपयोग करके स्थानिक क्वेरी को यथासंभव कुशल बनाने की कोशिश की है। राज्य की रूपरेखा का उपयोग करने से यह केवल धीमा हो जाएगा।)

# explain analyze select count(*) from gnis_names where state_alpha = 'AK';
Aggregate  (cost=57359.45..57359.46 rows=1 width=0) (actual time=76.606.. 76.607 rows=1 loops=1)
<snip>
Total runtime: 76.676 ms

# explain analyze select count(*) from gnis_names where the_geom && GeomFromText('POLYGON((-179.14734 51.219862,-179.14734 71.3525606439998,179.77847 71.3525606439998,179.77847 51.219862,-179.14734 51.219862))',4326);
Aggregate  (cost=27699.86..27699.87 rows=1 width=0) (actual time=86.523..86.524 rows=1 loops=1)
<snip>
Total runtime: 86.584 ms 

उसके लिए बहुत बहुत धन्यवाद। यह स्पष्ट हो सकता है जब आप इसे कहते हैं, लेकिन मेरा पहला विचार एक विशेषता-केवल नहीं एक स्थानिक क्वेरी को चलाने के लिए होगा। इसके लिए +1!
मैपोहॉलिक

0

इस कथन पर ध्यान दिया

मेरे लिए यह समझ में आता है। आप एक स्थानिक क्वेरी चलाते हैं = आपके पास एक स्थानिक सूचकांक होना चाहिए

मेरे लिए यह बिल्कुल भी समझ में नहीं आता है और मुझे लगता है कि SQL सर्वर और पोस्टगिस दोनों ही बेहतर काम करते हैं या कम से कम आपको प्रदर्शन विवरण से परेशान नहीं करते हैं। वास्तव में, SQL सर्वर और Postgis दोनों कभी-कभी स्थानिक सूचकांक का उपयोग भी नहीं करते हैं (पूर्ण तालिका स्कैन पर वापस लौटें)।

Oracle के लिए, आपको इंडेक्स बनाना होगा और इसलिए आपको user_sdo_geom_metadata भरना होगा।

बस इसे अल्फ़ान्यूमेरिक इंडेक्स के साथ तुलना करने के लिए, वे प्रदर्शन कारणों से हैं, आपके एसक्यूएल स्टेटमेंट को इसके साथ और बिना काम करना चाहिए।

ओरेकल डेटाबेस में, इंडेक्स को ड्रॉप करें और आपको त्रुटियों और एप्लिकेशन का भार मिलेगा जो स्थानिक प्रश्नों का उपयोग करने में सक्षम नहीं होंगे, इसलिए काम करने में विफल रहते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.