পোস্টগ্র্রেএসকিউএল 9.3.5 এবং পোস্টজিআইএস 2.1.4 ব্যবহার করে আমি ওএসএম ডেটার জন্য কিছু পরিসংখ্যান গণনা করার চেষ্টা করছি। আমি একটি ছোট বাভারিয়া নিষ্কাশন দিয়ে শুরু করেছি যা আমি জিওফাব্রিক থেকে ডাউনলোড করেছি। ডিবি স্কিমা হ'ল সাধারণ এপিআই 0.6 স্কিমা, ডেটা ডাম্প পদ্ধতির মাধ্যমে পোস্টগ্রিসে আমদানি করা হয়েছিল (pgsnapshot_schema_0.6 * .sql স্ক্রিপ্ট যা ওসোমোসিস সহ আসে) ব্যবহার করে। আনালাইজ ভ্যাকুয়ামও সঞ্চালিত হয়েছিল।
একমাত্র কাস্টম তৈরি জিনিসটি আমি ব্যবহার করছি একটি বহুভুজ টেবিল যা সমস্ত প্রশাসনিক সীমানা সম্পর্কের জন্য বহুভুজ রয়েছে। বহুভুজ জ্যামিতি কোনওভাবেই সরল করা হয়নি।
আমি এখন যা অর্জনের চেষ্টা করছি তা হ'ল বাভরিয়ার অ্যাডমিনের ভিতরে থাকা সমস্ত নোড = 6 সীমানা গণনা করা। এখানে আমার এসকিউএল ক্যোয়ারী:
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;
এই ক্যোয়ারির রানটাইমটি ভয়াবহ কারণ পোস্টগ্র্রেস নেস্টেড লুপ জোড় করছে এবং প্রতিটি অ্যাডমিন = 6 বাউন্ডারের জন্য সমস্ত নোড জুড়ে স্ক্যান করে। এফওয়াইআই, বাভারিয়া 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
) যে ট্যাগটি ব্যবহার করছেন তা টেবিলের অতিরিক্ত কলামগুলিতে বের করে আনুন এবং সেগুলি সরাসরি ব্যবহার করুন।