GIST इंडेक्स (<-> फ़ंक्शन) का उपयोग करके पोस्टगिस 2.0 में निकटतम पड़ोसी समस्या


25

मैं अपनी तालिका की प्रत्येक पंक्ति (cosn1), उसी वर्ग के निकटतम बहुभुज की दूरी की गणना करने के लिए, पोस्टगिस 2.0 नए फ़ंक्शन <-> (जियोमेट्री डिस्टेंस सेंट्रोइड) का उपयोग करने की कोशिश कर रहा हूं।

मैं निम्नलिखित कोड का उपयोग करने की कोशिश कर रहा था:

WITH index_query AS (
  SELECT g1.gid As ref_gid, ST_Distance(g1.the_geom,g2.the_geom) As ENN    
    FROM "cosn1" As g1, "cosn1" As g2   
    WHERE g1.gid <> g2.gid AND g1.class = g2.class
    ORDER BY g1.gid, g1.the_geom <-> g2.the_geom) 
SELECT DISTINCT ON (ref_gid) ref_gid, ENN 
    FROM index_query
ORDER BY ref_gid, ENN;

लेकिन तब मुझे चेतावनी का एहसास हुआ:

नोट: यदि केवल एक ज्यामितीय (एक उपश्रेणी / cte में नहीं) है तो इंडेक्स केवल किक करता है। जैसे 'SRID = 3005; POINT (1011102 450541)' :: a.geom के बजाय ज्यामिति

इसका मतलब है कि इंडेक्स अभ्यस्त बिल्कुल भी नहीं होगा, और क्वेरी का उपयोग करने से पहले लगभग एक ही समय लगेगा:

SELECT DISTINCT ON(g1.gid)  g1.gid As ref_gid, ST_Distance(g1.the_geom,g2.the_geom) As ENN    
    FROM "cosn1" As g1, "cosn1" As g2   
    WHERE g1.gid <> g2.gid AND g1.class = g2.class
    ORDER BY g1.gid, ST_Distance(g1.the_geom,g2.the_geom)

क्या कोई मुझे एक वैकल्पिक हल बता सकता है जो मुझे अपनी क्वेरी के प्रदर्शन में सुधार करने की अनुमति देता है?

आपका बहुत बहुत धन्यवाद।


अभी तक कोई प्रतिक्रिया न देते हुए, आप पोस्टजीस मेलिंग सूची पर यह पूछना चाहते हैं।
जीआईएस-जोनाथन

मैंने पहले ही किया था, लेकिन बिना किसी प्रतिक्रिया के भी।
अलेक्जेंड्रे नेटो

3
आप g1.gid> g2.gid का उपयोग उस क्‍लॉज में कर सकते हैं, जिससे आपके द्वारा की जाने वाली दूरी की गणना की संख्या कम हो जाएगी। दुर्भाग्य से, जब तक <-> ऑपरेटर बिना स्थिरांक के काम करता है, तब तक हम इस तरह के क्वेरी में बहुत अधिक गति सुधार नहीं देखेंगे।
जॉन पॉवेल

जॉन, मुझे सभी ग्रिड रखने की जरूरत है, यहां तक ​​कि उन लोगों को भी दोहराया जाता है जिन्हें मुझे अपने "cosn1" तालिका में प्रत्येक पॉलीगॉन के लिए ईईएन को अपडेट करने की आवश्यकता होती है। लेकिन आपने जो कहा, उसने मुझे एक विचार दिया। जैसा कि आप कह सकते हैं कि g1.gid> g2.gis का उपयोग करके दूरी की गणना को कम किया जा सकता है, लेकिन परिणाम में g1.gid और g2.gid को ध्यान में रखते हुए। उसके बाद, मैं इसके दो उपवर्गों को जोड़ सकता था (एक g1.gis को gid के रूप में, और दूसरे को g2.gid के साथ)। साभार
एलेक्जेंडर नेटो

मैंने पाया कि एसक्यूएल फंक्शन के अंदर <-> को एक पैरामीटर के रूप में उपयोग करके, निरंतर समस्या को हल करने के लिए एक संभावित समाधान <-> का उपयोग किया जाएगा। मैंने कुछ परीक्षण किए हैं, और कुछ मामलों में इसकी बहुत तेजी से ()। लेकिन मेरे मामले में, चूंकि दूरी एक ही तालिका के अंदर होती है, प्रक्रिया के दौरान कई दूरी की गणना दोहराई जाती है, जिससे यह सीधे क्वेरी का उपयोग करने की तुलना में धीमी हो जाती है।
अलेक्जेंड्रे नेटो

जवाबों:


2

मेरे मशीन पर कुछ परीक्षण कर रहे हम इस ऑपरेटर की तरह लग रहे थे <-> ठीक से काम नहीं कर रहा है। मुझे यकीन नहीं है कि यह एक बग है, लेकिन इसने ज्यामिति को ओवरलैप नहीं करने पर शून्य दूरी की सूचना दी। इंट्रींग न?

अच्छी तरह से निष्पक्ष पारंपरिक एसक्यूएल क्वेरी अनुकूलन के बारे में क्या? चूंकि उन अप्रत्याशित परिणामों के साथ <-> ऑपरेटर मैं इसे st_centroid से बदल देता हूं। गति में बहुत बेहतर परिणाम मिले।

St_overlaps के साथ आशा शब्दार्थ समान रहते हैं। कम से कम मुझे इस बारे में प्रलेखन से समझा गया था <->

डॉक्स से पोस्टिज <-> पर

अन्य ज्यामिति प्रकारों के लिए फ्लोटिंग पॉइंट बाउंडिंग बॉक्स सेंट्रोइड्स के बीच की दूरी वापस आ जाती है।

~ 5.5k बहुभुजों के साथ मेरे परीक्षण डेटा पर स्थानिक अनुक्रमण के बिना ~ 1000 सेकंड से ~ 5 सेकंड तक की गति मिली।

वैसे भी समूह बनाने के लिए DISTINCT ON का उपयोग क्यों किया जाता है? मुझे लगता है कि कुछ लोग इसका उपयोग कर रहे हैं लेकिन डुप्लिकेट को समाप्त करने के लिए समूह मौजूद नहीं है?

St_centroid त्रुटि के बिना मानक SQL ऑप्टिमाइज़ेशन के साथ आपकी क्वेरी शुरू की गई

select g1.gid, min( st_distance( g1.the_geom, g2.the_geom ) ) AS enn
FROM 
  "cosn1" AS g1, "cosn1" AS g2
WHERE
  g1.gid <> g2.gid
  AND g1.class = g2.class
  AND g1.the_geom && g2.the_geom
GROUP BY
  g1.gid

हैप्पी क्रिसमस की छुट्टी!


क्षमा करें, लेकिन आपका उत्तर समस्या का समाधान नहीं करता है। यह वास्तव में बहुत तेजी से है, लेकिन परिणाम सटीक नहीं हैं, क्योंकि अंतिम परिणाम की गणना उनके वास्तविक ज्यामिति के बजाय बहुभुज के केंद्रक का उपयोग करके की जाती है। <-> का उद्देश्य निकटतम पड़ोसी के लिए उम्मीदवारों की खोज को अनुकूलित करना है लेकिन अंत में सबसे अच्छे उम्मीदवारों से दूरी की गणना करने के लिए वास्तविक ज्यामिति का उपयोग करना चाहिए। मैंने DISTINCT ON \ ORDER BY के बजाय MIN \ GROUP BY का उपयोग करने का भी प्रयास किया, और यह धीमा प्रतीत होता है।
अलेक्जेंड्रे नेटो

लेकिन ऑपरेटर के लिए पोस्टगिस मैनुअल <-> में कहा गया है कि यह गैर बिंदु ज्यामितीय के लिए सेंट्रोइड का उपयोग करता है। तो मेरा समाधान आपको समान परिणाम देगा। इसे आपको अपनी शीर्ष क्वेरी के समान परिणाम देने चाहिए। कृपया जांचें कि ऑपरेटर के साथ परिणाम <-> भी सही हैं। इसने मुझे अपने परीक्षण डेटा पर शून्य लंबाई की ज्यामिति की सूचना दी ताकि इसके परिणाम को तोड़ा जा सके और इस समाधान ने अधिक सटीक डेटा दिया। यदि आप कुछ पेस्टी साइट पर त्रुटियों को दिखाते हुए कुछ नमूना रिकॉर्ड पोस्ट करने में सक्षम हैं, तो हम समाधान पर खामियों की खोज कर सकते हैं।
कैविला

यदि आप मेरी क्वेरी की जांच करते हैं, तो <-> ऑपरेटर का उपयोग केवल उम्मीदवारों को ऑर्डर करने के लिए किया जाएगा, अंतिम परिणाम की गणना वास्तविक ज्यामितीय का उपयोग करके की जाती है। वैसे भी, जैसा मैंने पहले कहा था, <-> प्रदर्शन को बढ़ावा केवल निश्चित बिंदुओं के साथ काम करता है। यह मेरा मूल प्रश्न था।
अलेक्जेंड्रे नेटो

तो, क्या आप सहमत हैं कि शीर्ष क्वेरी नीचे क्वेरी के बराबर नहीं है? चूंकि ऑर्डर बदल जाएगा क्योंकि ऑपरेटर <-> st_centroid द्वारा ORDER करेगा और st_distance आपको एक अलग मूल्य देगा? भिन्न आदेश खंड पर DISTINCT पास करने के लिए पहली पंक्ति के रूप में एक अलग क्वेरी ला सकता है? मान्य क्वेरी नीचे एक होगी जिसे गति सुधार की आवश्यकता है?
कैविला

हां, पहली क्वेरी नीचे एक पर गति में सुधार करने का इरादा है। और हाँ, यह थोड़ा अलग परिणाम दे सकता है, क्योंकि g1.geom <-> g2.geom सेंट्रोइड्स का उपयोग करता है, और इसका मतलब है कि पहली पंक्ति करीब नहीं हो सकती है। इसे काम करने के लिए मुझे विश्वास है कि मुझे आदेश की एक सीमा रखनी होगी, क्योंकि खण्ड १० की सीमा के अनुसार दूरी के वास्तविक मूल्यों को निकाल देगा। यहां तक ​​कि इसके बजाय <#> का उपयोग कर सकते हैं, कि सेंट्रोइड के बजाय बाउंडिंग बॉक्स का उपयोग करता है।
अलेक्जेंड्रे नेटो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.