2012-07-01 19 views
5

मेरे पास दो टेबल हैं जिन्हें मैं छेड़छाड़ करना चाहता हूं। पहली तालिका लगभग 50 मिलियन अंक का प्रतिनिधित्व करती है और दूसरा दुनिया के सभी देशों की बहुभुज परत है। मैं उन पॉलीगॉन के साथ छेड़छाड़ करने वाले सभी बिंदु प्राप्त करना चाहता हूं।पोस्टग्रेस्क्ल स्पेटियल क्वेरी बहुत धीमी

SELECT d.id, d.geom 
FROM export d, world_boundaries b 
WHERE (b.cntry_name = 'UK') 
    AND d.date_inserted >= '2012-06-01' 
    AND d.geom && b.wkb_geometry 
    AND intersects(d.geom, b.wkb_geometry); 

यह क्वेरी बहुत सरल है लेकिन इसे चलाने में 4 घंटे से अधिक समय लगता है। मेरे पास प्रत्येक तालिका के लिए ज्यामिति कॉलम पर निर्मित GIST इंडेक्स हैं और VACUUM ने उन्हें दोनों को विश्लेषण किया है। अभी भी कोई प्रदर्शन वृद्धि नहीं है। मैं पोस्टग्रेस 8.4 और पोस्टजीआईएस 1.5 के साथ CENTOS 6 चला रहा हूं। क्या कोई चीजों को गति देने के बारे में कुछ प्रकाश डाल सकता है? 1000 से 10000 रिकॉर्ड्स तक क्वेरी को सीमित करते समय मुझे परिणाम बहुत जल्दी मिलते हैं। जब मैं पूर्ण परिणाम सेट को पकड़ने की कोशिश करता हूं तो यह ड्रैग होता है। विचार?

अद्यतन: अब मुझे लगता है कि मुझे अपनी प्रक्रिया को इस प्रक्रिया में पहले चरण के रूप में परिशोधित करना है। मुझे इस

select astext(st_envelope(wkb_geometry)) as e 
from world_borders 
where cntry_name = 'UK' 

जैसे लिफ़ाफ़ा मिलता है, अब संपूर्ण क्वेरी के हिस्से के रूप में इसे शामिल/निष्पादित करने का सबसे प्रभावी तरीका क्या है?

+1

हालिया रिलीज में से प्रत्येक ने जीआईएसटी और जीआईएन इंडेक्स में सुधार किया है। आप एक नई बड़ी रिलीज के लिए अपग्रेड पर विचार करना चाह सकते हैं। 9.2 बीटा रिलीज पर आपकी समस्या का प्रयास करने के लायक भी हो सकता है, क्योंकि इसमें एसपी-जीआईएसटी शामिल है। http://www.postgresql.org/docs/9.2/static/spgist-intro.html – kgrittn

उत्तर

1

यह देखने के लिए कि क्या इंडेक्स का उपयोग किया जा रहा है, EXPLAIN (और LIMIT) के साथ इसे चलाने का प्रयास करें।

चूंकि वास्तविक छेड़छाड़ की जांच वहां सबसे धीमी ऑपरेशन है, तो शायद इसे सबक्वायरी के ST_Collect (सब कुछ लेकिन ST_Intersects चेक) के विरुद्ध चलने में मदद मिलेगी। इस तरह वहां केवल एक कॉल होगी और यदि बहुविवाह निर्माण पर्याप्त तेज़ है, तो शुद्ध परिणाम बेहतर हो सकता है।

edit1: खैर, यह बाद से जब तक आप 3D के लिए निर्देशांक के लिए मजबूर (भी आईडी धारण करने के लिए), एक अतिरिक्त देखने ज्यामिति आईडी प्राप्त करने के लिए की जरूरत है, तो इष्टतम नहीं है पता चला है:

SELECT d.id, d.geom 
FROM 
(
    SELECT * 
    FROM 
    ( 
     SELECT ST_Collect(d.geom) 
     FROM export d, world_boundaries b 
     WHERE (b.cntry_name = 'UK') 
     AND d.date_inserted >= '2012-06-01' 
     AND d.geom && b.wkb_geometry 
    ) as c, world_boundaries b 
    WHERE (b.cntry_name = 'UK') 
    AND ST_Intersection(c.geom, b.wkb_geometry); 
) as e, export d 
WHERE (ST_Dump(e.geom)).geom = d.geom 
+2

'LIMIT' के साथ योजना के समान रूप से' LIMIT' के साथ उत्पन्न योजना की अपेक्षा न करें। यह * वही हो सकता है, लेकिन यह पूरी तरह से अलग हो सकता है, क्योंकि योजनाकार पंक्तियों की अनुरोधित संख्या को वापस करने की सबसे सस्ती योजना की तलाश करेगा, बल्कि सभी पंक्तियों को वापस करने की सबसे सस्ती योजना। वे अक्सर अलग होते हैं। – kgrittn

+0

उपरोक्त SQL कथन के साथ ST_Collect() सबक्वायरी का उदाहरण प्रदान करने का कोई मौका? – aeupinhere

+0

@kgrittn बेशक, लेकिन मुझे संदेह है कि वहां एक इंडेक्स का उपयोग नहीं करना सस्ता होगा, इसलिए मैंने जो कहा उसके लिए निदान के रूप में यह ठीक होना चाहिए। – lynxlynxlynx

संबंधित मुद्दे