কেন st_inters && এর চেয়ে দ্রুততর


10

এটা পয়েন্ট একটি টেবিল। M 1M রেকর্ড

SELECT COUNT(*) as value FROM alasarr_social_mv s; 
Output: 976270

দেখে মনে হচ্ছে st_intersects বাহিনীকে স্থানিক সূচকগুলি ব্যবহার করতে পারে তবে && করে না।

ST_Intersects(282 মিমি) ব্যবহার করে নমুনা

SELECT COUNT(*) as value
FROM alasarr_social_mv 
WHERE ST_Intersects(
  the_geom_webmercator, 
  ST_MakeEnvelope(-410961,4920492,-402305,4926887,3857)
)


Aggregate  (cost=34370.18..34370.19 rows=1 width=0) (actual time=282.715..282.715 rows=1 loops=1)
  ->  Bitmap Heap Scan on alasarr_social_mv s  (cost=5572.17..34339.84 rows=60683 width=0) (actual time=21.574..240.195 rows=178010 loops=1)
        Recheck Cond: (the_geom_webmercator && '0103000020110F0000010000000500000000000000441519C1000000002BC5524100000000441519C1000000C069CB524100000000048E18C1000000C069CB524100000000048E18C1000000002BC5524100000000441519C1000000002BC55241'::geometry)
        Filter: _st_intersects(the_geom_webmercator, '0103000020110F0000010000000500000000000000441519C1000000002BC5524100000000441519C1000000C069CB524100000000048E18C1000000C069CB524100000000048E18C1000000002BC5524100000000441519C1000000002BC55241'::geometry)
        Heap Blocks: exact=4848
        ->  Bitmap Index Scan on alasarr_social_mv_gix  (cost=0.00..5569.13 rows=182050 width=0) (actual time=20.836..20.836 rows=178010 loops=1)
              Index Cond: (the_geom_webmercator && '0103000020110F0000010000000500000000000000441519C1000000002BC5524100000000441519C1000000C069CB524100000000048E18C1000000C069CB524100000000048E18C1000000002BC5524100000000441519C1000000002BC55241'::geometry)
Planning time: 0.192 ms
Execution time: 282.758 ms

&&(414 মিমি) ব্যবহার করে নমুনা

SELECT COUNT(*) as value
FROM alasarr_social_mv  
WHERE the_geom_webmercator && 
  ST_MakeEnvelope(-410961,4920492,-402305,4926887,3857)

Aggregate  (cost=22535.97..22535.97 rows=1 width=0) (actual time=414.314..414.314 rows=1 loops=1)
  ->  Seq Scan on alasarr_social_mv  (cost=0.00..22444.94 rows=182050 width=0) (actual time=0.017..378.427 rows=178010 loops=1)
        Filter: (the_geom_webmercator && '0103000020110F0000010000000500000000000000441519C1000000002BC5524100000000441519C1000000C069CB524100000000048E18C1000000C069CB524100000000048E18C1000000002BC5524100000000441519C1000000002BC55241'::geometry)
        Rows Removed by Filter: 798260
Planning time: 0.134 ms
Execution time: 414.343 ms

পোস্টজিআইএস সংস্করণ

POSTGIS="2.2.2" GEOS="3.5.0-CAPI-1.9.0 r4084" PROJ="Rel. 4.8.0, 6 March 2012" GDAL="GDAL 1.11.0, released 2014/04/16" LIBXML="2.7.8" LIBJSON="UNKNOWN" (core procs from "2.2.2" need upgrade) RASTER (raster procs from "2.2.2" need upgrade)  alasarr 2 mins ago

2
প্রশ্নের স্ক্রিনশটগুলিকে প্রশ্নের মধ্যে পেস্ট করবেন না। আপনি কি কোড হিসাবে কপি এবং পেস্ট করতে পারেন? আপনাকে সাহায্য করার জন্য আমি এগুলি পড়তে পারি না।
ইভান ক্যারল

সম্পন্ন. আমার মনে হয় এখন কিছুটা ভাল
আলাসার

আমি আপনার নতুন ক্যোয়ারী পরিকল্পনাটিকে ব্যাকপোর্ট করার চেষ্টা করেছি। পরিকল্পনা আপগ্রেড নির্দ্বিধায় কিন্তু শৈলী রাখা চেষ্টা করুন।
ইভান ক্যারল

4
কটাক্ষপাত আছে এই প্রশ্নের । && অপারেটরটি আসলে একটি বাউন্ডিং বক্স কোয়েরি করে, এস, এস, ইন্টারেক্টসগুলি কোন জ্যামিতিগুলি প্রকৃত তুলনার জন্য পরীক্ষা করতে হবে তা নির্ধারণ করার জন্য একটি বাউন্ডিং বক্স কোয়েরি ব্যবহার করে - যাতে আপনি প্রত্যাশা করবেন ও আরও দ্রুত হবে। যাইহোক, সম্ভবত এটি সম্ভব হয় যে ST_MakeEnvelope এর &&& এর ডানদিকে ব্যবহার করে ক্যোয়ারী পরিকল্পনাকারী কোনও কারণে একটি পূর্ণ টেবিল স্ক্যান বেছে নিয়েছে (ব্যাখ্যাটি থেকে স্পষ্টভাবে)। প্রথমে একটি সিটিইতে জ্যামিতি তৈরি করার চেষ্টা করুন এবং দেখুন আপনি অপ্টিমাইজারটিকে "বোকা" করতে পারেন কিনা।
জন পাওয়েল

তুমি ঠিক বলছো! এটি একটি সিটিই

উত্তর:


16

এই ধরণের সন্ধানটি প্রায়শই প্রায়শই আসে এবং এটি কিছুটা অস্পষ্ট, তাই বিশ্রাম নেওয়ার মতো। যদি আপনি এমন কোনও ফাংশনের মধ্যে কোনও জ্যামিতি সংজ্ঞায়িত করেন যা এটি ব্যবহার করে যেমন ST_Intersects বা && (যা হডের নীচে ST_Intersects ব্যবহার করে), তবে ক্যোয়ারি পরিকল্পনাকারী একটি পূর্ণ টেবিল স্ক্যান বেছে নেয়, কারণ "এটিতে" জ্যামিতি তৈরির ফলাফলের কোনও জ্ঞান নেই ফাংশন, অর্থাত্, এই ক্ষেত্রে এসT_MakeEnvelope .. আপনি যদি জ্যামিতিটি সংজ্ঞায়িত করেন তবে আপনি কোনও সিটিইতে ছেদটি পরীক্ষা করতে চান, তবে অপটিমাইজার একটি পরিচিত পরিমাণ নিয়ে কাজ করছে এবং যদি উপলব্ধ থাকে তবে একটি স্থানিক সূচক ব্যবহার করবে।

সুতরাং, আপনার ক্যোয়ারীটি আবার লিখুন:

WITH test_geom (geom) AS 
   (SELECT ST_MakeEnvelope(-410961,4920492,-402305,4926887,3857))
  SELECT COUNT(*) as value
    FROM alasarr_social_mv mv, test_geom tg 
   WHERE ST_Intersects(mv.the_geom_webmercator, tg.geom)

এখন একটি স্থানিক সূচক ব্যবহার করবে। তেমনি, && এখন বাউন্ডিং বাক্সটি পরীক্ষা করতে একটি সূচক ব্যবহার করবে এবং (যদিও আমি আপনার ডেটার বিপরীতে পরীক্ষা করতে পারছি না) এস এস ইন্টারেক্টেসের চেয়ে দ্রুত হওয়া উচিত।

মজার বিষয় হল, আপনার ক্যোয়ারিতে, ST_Intersects একটি বিটম্যাপ স্ক্যান (কোনও সংক্ষেপ নয়) সূচক ব্যবহার করছে, যখন && কোনও সূচক ব্যবহার করছে না। সুতরাং, উভয় প্রশ্ন সিটিই-র সাথে দ্রুততর হবে, তবে &&& এখন এস এস ইন্টারেক্টেসের চেয়ে দ্রুত হওয়া উচিত।

এই প্রশ্নে কী চলছে এবং এর উত্তর / মন্তব্যগুলির আরও ব্যাখ্যা রয়েছে ।

সম্পাদনা : এটি সুস্পষ্ট করার জন্য, আপনি যদি Postgis.sql- এ এস T_Intersects এর সংজ্ঞাটি দেখুন (যা আপনার পোস্টগ্রিজ ইনস্টলটির অবদানCREATE EXTENSION postgis ডিরেক্টরিতে বলা হয় এবং পাওয়া যায়) আপনি দেখতে পাবেন:

---- Inlines index magic
CREATE OR REPLACE FUNCTION ST_Intersects(geom1 geometry, geom2 geometry)
    RETURNS boolean
    AS 'SELECT $1 OPERATOR(&&) $2 AND _ST_Intersects($1,$2)'
    LANGUAGE 'sql' IMMUTABLE ;

মন্তব্য সহ: ইনলাইন ইনডেক্স যাদু।


1
আমি মনে করি না যে ST_ আন্তঃরক্তগুলি হুডের নীচে && ব্যবহার করে।
ইভান ক্যারল

4
@ ইভানক্রোল, আমার সম্পাদনা পরীক্ষা করুন। Postgis.sql এ দেখুন, যেখানে কার্যগুলি সংজ্ঞায়িত করা হয়েছে এবং এটি আরও পরিষ্কার হওয়া উচিত।
জন পাওয়েল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.