बहुभुज क्वेरी में प्वाइंट के लिए जिस्ट इंडेक्स के माध्यम से प्रदर्शन लाभ


10

मेरे पास दो टेबल हैं: स्थान (आईडी, Region_id, the_geom) और क्षेत्र (id, the_geom)। प्रत्येक स्थान बिंदु के लिए मैं यह निर्धारित करना चाहता हूं कि यह किस क्षेत्र में स्थित है:

UPDATE locations SET region_id = 
 (SELECT id FROM regions 
  WHERE ST_Within(locations.the_geom,regions.the_geom)
 );

क्या यह स्थान बिंदुओं पर GIST सूचकांक बनाने के लिए समझ में आता है? मैं इस क्षेत्र बहुभुज पर एक सूचकांक का निर्माण करूंगा लेकिन मैं अंकों के बारे में अनिश्चित हूं। क्या यह क्वेरी को गति देगा?

जवाबों:


14

संक्षिप्त उत्तर: अद्यतन क्वेरी के इस प्रकार जी नहीं हम में प्रत्येक पंक्ति के अपडेट कर रहे हैं locations( "Seq स्कैन"), और पर सार सूचकांक the_geomमें regionsके लिए सीमा पंक्तियों की मदद करने में पर्याप्त है ST_Withinजोड़ी-अप से सही पंक्ति में हालत regions


लंबा उत्तर: यह पता लगाने के लिए जादू की तुलना करना है कि आपको व्याख्या क्वेरी से क्या मिलता है । PgAdmin III से, क्वेरी संपादक के शीर्ष पर एक "क्वेरी समझाएं" बटन है, या pgsql से, बस "क्वेरी" के साथ अपनी क्वेरी को उपसर्ग करें:

postgis=# explain UPDATE locations SET region_id =
postgis-#  (SELECT id FROM regions
postgis(#   WHERE ST_Within(locations.the_geom, regions.the_geom)
postgis(#  );
                                         QUERY PLAN
--------------------------------------------------------------------------------------------
 Seq Scan on locations  (cost=0.00..8755.54 rows=1000 width=110)
   SubPlan 1
     ->  Index Scan using regions_gist_the_geom on regions  (cost=0.00..8.52 rows=1 width=4)
           Index Cond: ($0 && the_geom)
           Filter: _st_within($0, the_geom)
(5 rows)

आपको वह सब कुछ समझने की ज़रूरत नहीं है जो यहाँ खाँसी है। यहां देखने वाली महत्वपूर्ण बात यह है कि सबसे भीतरी भाग (सबप्लान 1) में यह "इंडेक्स" (= एक इंडेक्स का उपयोग करता है, जो कि चीजों को गति प्रदान कर सकता है), और "Seq स्कैन" (= अनुक्रम स्कैन), अर्थात प्रत्येक की जाँच नहीं करता है पंक्ति यह देखने के लिए कि क्या यह भीतर है, जो धीमा हो सकता है)। यदि आप किसी GiST इंडेक्स को जोड़ / हटाते हैं locations, तो इस व्याख्या क्वेरी का आउटपुट बिल्कुल समान है, इसलिए क्वेरी का प्रदर्शन समान होना चाहिए।

हालाँकि, यदि आप मूर्खतापूर्ण कुछ करते हैं, और अपने GiST इंडेक्स को हटाते हैं regions, तो आप एक ही क्वेरी से ऊपर की तरह एक अलग क्वेरी प्लान देखते हैं:

                             QUERY PLAN
---------------------------------------------------------------------
 Seq Scan on locations  (cost=0.00..74288.00 rows=1000 width=110)
   SubPlan 1
     ->  Seq Scan on regions  (cost=0.00..74.05 rows=1 width=4)
           Filter: (($0 && the_geom) AND _st_within($0, the_geom))
(4 rows)

दो व्याख्या प्रश्नों के बीच देखने के लिए महत्वपूर्ण बात यह है कि अधिकतम लागत अनुमान है। इसके विपरीत 74.05 यहाँ 8.52 से पहले है, इसलिए आप इस क्वेरी को धीमा होने की उम्मीद करेंगे।

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