সংযুক্ত হস্টোর কী / মান এবং স্থানিক ক্যোয়ারী বড় ওএসএম এক্সট্র্যাক্টগুলি পরিচালনা করতে খুব ধীর


13

পোস্টগ্র্রেএসকিউএল 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;

1
আপনার কি বাভারিয়া.নোডে স্থানিক সূচক রয়েছে?
ব্যবহারকারী 30184

হ্যাঁ, আমি প্রশ্নটি সম্পাদনা করেছি এবং নোডগুলিতে সূচি এবং ক্যোয়ারী পরিকল্পনা সম্পর্কে তথ্য সরবরাহ করেছি
আলফ কোর্টিগ

3
দুটি বিকল্প। 1 - বিস্তৃত ট্যাগগুলির জন্য একটি সূচক যুক্ত করুন। 2 - আপনি আপনার ক্যোয়ারির জন্য ( boundaryএবং admin_level) যে ট্যাগটি ব্যবহার করছেন তা টেবিলের অতিরিক্ত কলামগুলিতে বের করে আনুন এবং সেগুলি সরাসরি ব্যবহার করুন।
ব্র্যাডহার্ডস 26'15

সম্পাদনা দেখুন (3): দুটি সূচক যুক্ত করা হয়েছিল, তবে ক্যোয়ারী পরিকল্পনায় বা রানটাইমের কোনও পরিবর্তন হয়নি।
আল্ফ কোর্টিগ

কিছু পরীক্ষার পরে আমি নিশ্চিত নই যে আমি (3) সালে সঠিক সূচী তৈরি করেছি কিনা। এখনও অবধি, আমি -> এবং এর জন্য একটি সূচক তৈরি করতে পেরেছি? hstore অপারেটর। যাইহোক, আমি আমার
প্রশ্নে

উত্তর:


5

এইস্টোর ট্যাগগুলির সূচকের সেরা উপায় হ'ল জিআইএন বা জিআইএসটি সূচকগুলি ব্যবহার করা হয়, যেগুলি ডক্স থেকে @>,?,? & এবং সমর্থন করে ? অপারেটরগুলি , যা কী এবং কী / মান জোড় অনুসন্ধান করে। আপনি একটি বি-ট্রি ইনডেক্সের জন্য ট্যাগগুলি বের করার জন্য কোনও ফাংশনটি ব্যবহার করার পক্ষে যুক্তিযুক্ত, তবে আপনি নির্দিষ্ট কী / মান জোড়ার জন্যও পরীক্ষা করছেন বলে বিশ্লেষক একটি পূর্ণ টেবিল স্ক্যান বেছে নিয়েছেন।

আমার বাভারিয়া.রেলপলিগনস অ্যাক্সেস নেই তবে গতি সীমা এবং হাইওয়ে ট্যাগগুলির বিষয়ে ওএসএম ইউকে এর অনুরূপ ক্যোয়ারির ভিত্তিতে আমি নিম্নলিখিত প্রশ্নের সাথে আমার ব্যাখ্যাটির জন্য এটি পেয়েছি:

SELECT count(*) 
 FROM ways 
WHERE tags @> 'highway=>motorway'::hstore 
 AND tags @> 'maxspeed=>"50 mph"'::hstore;


Aggregate  (cost=48.66..48.67 rows=1 width=0)
    ->  Index Scan using ix_ways_tags_gist on ways  (cost=0.42..48.64 rows=11 width=0)
     Index Cond: ((tags @> '"highway"=>"motorway"'::hstore) AND (tags @> '"maxspeed"=>"50 mph"'::hstore))

যা সরাসরি সূচক স্ক্যান দেখায় (গিস্ট সূচকটি ব্যবহার করে), যা এক কোটির জন্য ১০ মিলিয়ন সারি উত্সাহজনক। সূচকটি সহজ দ্বারা তৈরি করা হয়েছিল:

CREATE INDEX ix_ways_tags_gist ON ways USING gist (tags);

যদিও আমি আপনাকে স্থানিক অবস্থা যাচাই করতে পারি না, আমি অনুমান করছি যে এটির চেয়ে কম নির্বাচনী

যেখানে relpoly.tags @> '"সীমানা" => "প্রশাসনিক", "অ্যাডমিন_লেভেল" => "6"' :: হস্টোর।

এবং তাই কেবল পুনর্বার শর্তের জন্য ব্যবহৃত হবে।

জিআইএন এবং জিআইএসটি সূচকগুলির মধ্যে পার্থক্য সম্পর্কে এই দুর্দান্ত এসও উত্তরও রয়েছে । সাধারণ সন্ধানটি হ'ল জিআইএন সূচকগুলি বৃহত্তর এবং গড়তে ধীর হলেও পাঠ্য পুনরুদ্ধার সমস্যার ক্ষেত্রে আরও দ্রুত faster

এত দেরিতে উত্তর দেওয়ার জন্য দুঃখিত, তবে আমি সম্প্রতি ওএসএম এবং hstore তে একই রকম কাজ করছি এবং আবিষ্কার করেছি যে আমি কেবল এই প্রশ্নটিই একবার তারকাচিহ্নিত করি নি, তবে আমি এখনই এর উত্তর দিতে পারি: ডি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.