मैं PostgreSQL 9.3.5 और PostGIS 2.1.4 का उपयोग करके OSM डेटा के लिए कुछ आंकड़ों की गणना करने की कोशिश कर रहा हूं। मैंने एक छोटी बावरिया अर्क के साथ शुरुआत की जिसे मैंने जियोफैब्रिक से डाउनलोड किया। डीबी स्कीमा सामान्य एपीआई 0.6 स्कीमा है, डेटा को पोस्टग्रेज में डंप दृष्टिकोण (pgsnapshot_schema_0.6 .sql स्क्रिप्ट जो परासरण के साथ आता है) के माध्यम से आयात किया गया था। ANALYZE VACUUM का प्रदर्शन भी किया गया।
एकमात्र कस्टम मेड चीज़ जो मैं उपयोग कर रहा हूं वह एक बहुभुज तालिका है जिसमें सभी प्रशासनिक सीमा संबंधों के लिए बहुपरत शामिल हैं। बहुभुज ज्यामिति को किसी भी तरह से सरल नहीं किया गया था।
अब मैं जो कुछ हासिल करने की कोशिश कर रहा हूं, वह सभी नोड्स को गिन रहा है जो कि व्यवस्थापक के अंदर हैं = बवेरिया की 6 सीमाएं। यहाँ मेरी SQL क्वेरी है:
SELECT relpoly.id, count(node)
FROM bavaria.relpolygons relpoly, bavaria.nodes node
WHERE relpoly.tags @> '"boundary"=>"administrative","admin_level"=>"6"'::hstore
AND ST_Intersects(relpoly.geom, node.geom)
GROUP BY relpoly.id;
इस क्वेरी का रनटाइम भयानक है क्योंकि Postgres नेस्टेड लूप जॉइन कर रहा है और हर एडमिन = 6 बाउंड्री के लिए सभी नोड्स पर स्कैन करता है। FYI करें, बवेरिया को 98 व्यवस्थापक = 6 बहुभुजों में विभाजित किया गया है और बावरिया अर्क में लगभग 30 मिलियन नोड हैं।
क्या यह उप-इष्टतम क्वेरी निष्पादन से बचने और पोस्टग्रेज को यह बताने के लिए संभव है कि यह केवल एक बार सभी नोड्स को स्कैन करे (जैसे, परिणाम सेट में संबंधित बहुभुज के लिए एक काउंटर बढ़ाकर या संकेत का उपयोग करके)?
संपादित करें:
1) एक स्थानिक सूचकांक बावरिया नोड्स पर मौजूद है:
CREATE INDEX idx_nodes_geom ON bavaria.nodes USING gist (geom);
2) क्वेरी योजना इस तरह दिखती है:
HashAggregate (cost=284908.49..284908.75 rows=26 width=103)
-> Nested Loop (cost=111.27..283900.80 rows=201537 width=103)
-> Bitmap Heap Scan on relpolygons relpoly (cost=4.48..102.29 rows=26 width=5886)
Recheck Cond: (tags @> '"boundary"=>"administrative", "admin_level"=>"6"'::hstore)
-> Bitmap Index Scan on relpolygons_geom_tags (cost=0.00..4.47 rows=26 width=0)
Index Cond: (tags @> '"boundary"=>"administrative", "admin_level"=>"6"'::hstore)
-> Bitmap Heap Scan on nodes node (cost=106.79..10905.50 rows=983 width=127)
Recheck Cond: (relpoly.geom && geom)
Filter: _st_intersects(relpoly.geom, geom)
-> Bitmap Index Scan on idx_nodes_geom (cost=0.00..106.55 rows=2950 width=0)
Index Cond: (relpoly.geom && geom)
3)
मैंने निम्नलिखित दो इंडेक्स बनाए, लेकिन क्वेरी प्लान (और रनटाइम) नहीं बदला
CREATE INDEX relpolygons_tags_boundary on bavaria.relpolygons( (tags->'boundary') );
CREATE INDEX relpolygons_tags_admin on bavaria.relpolygons( (tags->'admin_level') );
ANALYZE bavaria.relpolygons;
boundary
और admin_level
) के लिए आपके द्वारा उपयोग किए जा रहे टैग्स को टेबल पर मौजूद अतिरिक्त कॉलम में निकालें , और सीधे उन का उपयोग करें।