PostgreSQL / PostGIS स्थानिक सूचकांक - कोई गति नहीं


15

मेरे पास PostgreSQL / PostGIS डेटाबेस में एक स्थानिक तालिका है। इसमें प्रत्येक पंक्ति एक बहुभुज का प्रतिनिधित्व करती है। यह निम्नलिखित रूप में है:

+----+--------+
|gid |   way  |
+----+--------+
|241 | 01030..|

ज्यामितीय स्तंभ "रास्ता" है जिसमें एक बहुभुज के लिए ज्यामिति होती है। WKT में यह है: POLYGON (('....'))। मैं इस तालिका पर बहुत सारे ST_Contains प्रश्न कर रहा हूं, यह जांचने के लिए कि क्या दो बहुभुज एक दूसरे में समाहित हैं:

Select ST_Contains(a.way, b.way) From table AS a, table AS b Where a.gid = 15 And b.gid = 16

मैं सोच रहा था कि इस क्वेरी को कैसे तेज किया जाए और टेबल पर एक स्थानिक सूचकांक जोड़ा जाए:

CREATE INDEX table_way_gist ON table USING gist(way);

लेकिन वास्तव में मुझे कोई गति दिखाई नहीं देती। मैं सूचकांक बनाता हूं मैं सभी पॉलीगोन के साथ तालिका भरता हूं इससे पहले कि मैं ST_Contains क्वेरी करता हूं। क्या तालिका भरने से पहले सूचकांक को जोड़ा जाना चाहिए? क्या सूचकांक के साथ काम करने के लिए मेज पर विशेष आवश्यकताएं हैं? ज्यामितीय स्तंभ मार्ग का प्रक्षेपण (श्रीड) 900913 पर सेट है।

मैं उपयोग कर रहा हूं: psql (PostgreSQL) 9.1.4 / POSTGIS = "1.5.3"

जवाबों:


16

आपके प्रश्न में व्यक्त क्वेरी के लिए सबसे कुशल सूचकांक जीआईडी पर है क्योंकि यह एकमात्र स्तंभ है जो एक अभिव्यक्ति में प्रकट होता है:

 CREATE INDEX table_gid ON table (gid);

आप सुरक्षित रूप से गिस्ट इंडेक्स को गिरा सकते हैं क्योंकि यह केवल स्थान और धीमी आवेषण / अपडेट / डिलीट को कम करेगा।

लंबी व्याख्या

जैसा कि मैंने कहा कि आपके मामले में सबसे प्रभावी सूचकांक gid पर है क्योंकि यह db इंजन को पंक्तियों को तेजी से पुनः प्राप्त करने की अनुमति देगा (पुनर्प्राप्ति के साथ आमतौर पर प्रक्रिया का सबसे धीमा हिस्सा होता है)। उसके बाद यह शायद बेहतर परिणाम की गणना करेगा

  ST_Contains(a.way, b.way)

सूचकांक को देखे बिना जासूसी। कारण यह है कि क्वेरी योजनाकार की संभावना का अनुमान लगाएगा कि देख के अतिरिक्त लागत है सार दोनों स्तंभों पर सूचकांक बनाम को देख a.way और b.way सीधे मूल्यों लायक को देखने के लिए पंक्तियों की कुल संख्या के रूप में प्रयास नहीं है शायद बहुत छोटा है, खासकर अगर सूचकांक अद्वितीय है।

अंगूठे के एक नियम के रूप में याद रखें कि योजनाकार संभवतः छोटे डेटासेट के लिए एक सूचकांक स्कैन पर तालिका स्कैन का पक्ष लेंगे (डेटा तालिका आकार को देखकर अनुमानित हैं)।


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

?? आप कह रहे हैं कि एक स्थानिक सूचकांक चीजों को धीमा कर देता है? मेरे लिए यह एक नई बात है क्योंकि जहां मैं काम करता हूं, हमारे पास हर एक टेबल के लिए स्थानिक इंडेक्स होते हैं और मुझे आश्चर्य होता है कि क्या यह एक बुरा अभ्यास है
लफाइडुडे

13

जैसा कि unicoletti ने कहा, जियोमेट्री कॉलम में जिस्ट इंडेक्स केवल तभी काम करेगा जब आप WH_ अभिव्यक्ति में ST_Contains () का उपयोग करेंगे।

उदाहरण के लिए, यदि आप उन सभी बहुभुजों को जानना चाहते हैं जिनमें एक दूसरे का समावेश है, तो आप इस तरह से कुछ का उपयोग कर सकते हैं:

SELECT a.gid, b.gid
FROM table AS a, table as b
WHERE a.gid != b.gid and ST_Contains(a.way, b.way)

इस मामले में, आपकी तालिका के आकार और आपके ज्यामितीयता की जटिलता के आधार पर, गिस्ट इंडेक्स को एक महत्वपूर्ण गति प्रदान करनी चाहिए, क्योंकि ST_Contains अपने पूर्ण ज्यामितीयता की जांच करने से पहले अपनी सीमा के बक्सों की तुलना करके बहुभुजों को फ़िल्टर करके शुरू करेंगे। आप OpenGeo ट्यूटोरियल में एक छोटी सी व्याख्या देख सकते हैं ।


हां, मैं देख रहा हूं, सूचकांक सीमा परीक्षण को शामिल करने के लिए मुझे इस प्रश्न की आवश्यकता है। Thx अलेक्जेंड्रे। (मैं समाधान के रूप में unicoletti को चिह्नित करूँगा, क्योंकि वह तेज था और मेरे लिए इस मुद्दे को साफ कर दिया)
MichiMichbeck
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.