ST_ দূরত্ব স্থানিক ক্যোয়ারির জন্য সূচক ব্যবহার করে না


10

এমনকি সহজ জিজ্ঞাসার জন্যও একটি স্থানীয় সূচি ব্যবহার করতে পোস্টগ্রিজএসএল 9.3.5-এ চলছে পোস্টজিআইএস ২.১ আমি পেতে পারি না। পুরো ডেটা সেটটি (এখানে থেকে জনসংখ্যার গণনা গ্রিড) 8 মিলিয়ন পয়েন্ট । টেবিল হিসাবে তৈরি করা হয়

CREATE TABLE points (
    population DOUBLE PRECISION NOT NULL,
    location GEOGRAPHY(4326, POINT) NOT NULL
)
CREATE INDEX points_gix ON points USING GIST(location);

প্রশ্নগুলি যেমন তারা পায় তত সহজ

SELECT SUM(population)
FROM points
WHERE ST_Distance(
    location,
    ST_GeographyFromText('SRID=4326; POINT(0 0)')
) < 1000

পোস্টগ্রেএসকিউএল সর্বদা এর জন্য সিক স্ক্যান ব্যবহার করে, আমি 10000 পয়েন্ট সহ একটি উপসেট চেষ্টা করেছি - এখনও সিক স্ক্যান। কোন ধারনা?


3
আপনি এমন কোনও ফাংশন ব্যবহার করবেন না যা সূচকটি ব্যবহার করতে পারে। পরিবর্তে st_dwithin ব্যবহার করুন। তারপরে ফક્શનটি প্রথমে একটি সূচক স্ক্যান করবে।
নিক্লাস অ্যাভেন

আপনার জিজ্ঞাসাটি কী করছে তা সম্পর্কে চিন্তাভাবনা করুন - টেবিলের প্রতিটি পয়েন্ট থেকে একটি নির্দিষ্ট পয়েন্ট পর্যন্ত দূরত্ব গণনা করুন - এবং কেন আপনি কোনও সূচক ব্যবহার করতে পারবেন না তা বুঝতে পারবেন । পরিবর্তে এমন কোনও অপারেটর ব্যবহার করুন যা সূচক ব্যবহার করতে পারে, যেমন ST_DWithin
ভিন্স

উত্তর:


19

ST_ দূরত্ব আসলে সমস্ত জোড় পয়েন্টের মধ্যকার দূরত্ব গণনা করে, সুতরাং, কোনও সূচক ব্যবহার করা যায়নি। সুতরাং আপনার ক্যোয়ারীটি একটি সিক্যুয়েন্স স্ক্যান করবে এবং তারপরে সেই জ্যামিতিগুলি বেছে নেবে যা আপনি নির্ধারিত দূরত্বের চেয়ে কম are আপনি ST_DWithin সন্ধান করছেন , যা একটি সূচক ব্যবহার করে।

SELECT SUM(population) FROM points 
WHERE ST_DWithin(location, ST_GeographyFromText('SRID=4326; POINT(0 0)'), 1000);

ফলাফলের অর্ডার দেওয়ার জন্য ST_ দূরত্ব আরও কার্যকর, প্রায়শই অর্ডার বাই এবং / অথবা লিমিটেডের সাথে একত্রে, যেগুলি সূচি ব্যবহার করে এমন প্রশ্নের সাথে প্রাপ্ত হয়েছিল।


1
ধন্যবাদ। প্রশ্ন জিজ্ঞাসা করার আগে আমার সত্যিই ডক্স পড়া উচিত।
প্রান্তসন্নিকর্ষ

1
কি দারুন! ধন্যবাদ! St_dwithin এ st_distance পরিবর্তন করার কারণে আপনি আমার ধীর ক্যোয়ারিকে 100x ভাঁজ বা আরও বেশি করে "ত্বরান্বিত" করেছেন। (আমি বলি "ত্বরান্বিত" কারণ আমার বেশি যত্নবান হওয়ার পরে প্রথমদিকে এমনটি হওয়া উচিত ছিল না)
হেন্ডি ইরওয়ান

1
@HendyIrawan। আপনি স্বাগত জানাই। এটি করা সহজ ভুল।
জন পাওয়েল

@ জনপোয়েল্লাকা বারিয়া আমি আরেকটি অপ্টিমাইজেশন যুক্ত করেছি (যদিও খুব ক্ষতিগ্রস্থ হলেও আমি আমার মামলার জন্য একটি উত্তর যুক্ত করেছি) তবে আপনি আমাকে সঠিক দিক নির্দেশ করেছেন, ধন্যবাদ।
হেন্ডি ইরাওয়ান

4

@ জনপোয়েল্লাকা বারিয়া ST_DWithin()যেমন বলেছেন যে আপনি যখন সঠিকতা চান তখন যাওয়ার উপায় ।

তবে আমার ক্ষেত্রে আমি কেবল একটি মোটামুটি অনুমান করতে চাই তাই ST_DWithin()আমার প্রয়োজনের জন্য এমনকি খুব ব্যয়বহুল (ক্যোয়ারী ব্যয়ে) ছিল। পরিবর্তে আমি ব্যবহার করেছি &&এবং ST_Expand(box2d)( geometryসংস্করণটি দিয়ে এটি ভুল করবেন না )। উদাহরণ:

SELECT * FROM profile
  WHERE
    address_point IS NOT NULL AND
    address_point && CAST(ST_Expand(CAST(ST_GeomFromText(:point) AS box2d), 0.5) AS geometry;

অবিলম্বে কী স্পষ্ট হবে তা হ'ল আমরা মিটারের পরিবর্তে ডিগ্রি নিয়ে কাজ করছি এবং একটি গোলাকার মধ্যে বৃত্তের পরিবর্তে বাউন্ডিং বক্স ব্যবহার করছি। আমার ব্যবহারের ক্ষেত্রে, এটি 24 এমএস থেকে মাত্র 2 এমএসে কমেছে (স্থানীয়ভাবে এসএসডি তে)। তবে সাম্প্রতিক সংযোগ এবং কঠোরভাবে উদার আইওপিএস কোটা (100 আইওপিএস) সহ এডাব্লুএস আরডিএস পোস্টগ্রিএসকিউএল-এ আমার প্রোডাকশন ডাটাবেসের জন্য, মূল ST_DWithin()ক্যোয়ারীটি অনেক বেশি আইওপিএস ব্যয় করে এবং আইওপিএস কোটা হ্রাস পেলে 2000 এমএসেরও বেশি কার্যকর করতে পারে এবং আরও খারাপ হতে পারে ।

এটি সবার জন্য নয় তবে আপনি গতির জন্য কিছু সঠিকতা (বা আইওপিএস সংরক্ষণ করতে) দিতে পারেন, তবে এই পদ্ধতির আপনার পক্ষে হতে পারে। আপনি নীচের ক্যোয়ারী পরিকল্পনাগুলিতে দেখতে পাচ্ছেন, ST_DWithinরিচেক কনড ছাড়াও বিটম্যাপ হিপ স্ক্যানের অভ্যন্তরে একটি স্পেসিয়াল ফিল্টার প্রয়োজন, যখন &&একটি বাক্সে জ্যামিতির কোনও ফিল্টারের প্রয়োজন হয় না এবং কেবল পুনরায় পরীক্ষা করা হয়।

আমি আরও খেয়াল করেছি যে IS NOT NULLবিষয়গুলি, এগুলি ছাড়া আপনার আরও খারাপ কোয়েরি পরিকল্পনা থাকবে। দেখে মনে হয় এটির জন্য জিআইএসটি সূচকটি "স্মার্ট যথেষ্ট" নয়। (অবশ্যই আপনার কলামটি এটির প্রয়োজন হয় না NOT NULL, আমার ক্ষেত্রে এটি NULLসক্ষম)

20000 সারি টেবিল, ST_DWithin(geography, geography, 100000, FALSE)300 আইওপিএস সহ এডাব্লুএস আরডিএস 512 এমবি র‌্যামে:

Aggregate  (cost=4.61..4.62 rows=1 width=8) (actual time=2011.358..2011.358 rows=1 loops=1)
  ->  Bitmap Heap Scan on matchprofile  (cost=2.83..4.61 rows=1 width=0) (actual time=1735.025..2010.635 rows=1974 loops=1)
        Recheck Cond: (((address_point IS NOT NULL) AND (address_point && '0101000020E6100000744694F606E75A40D49AE61DA7A81BC0'::geography)) OR ((hometown_point IS NOT NULL) AND (hometown_point && '0101000020E6100000744694F606E75A40D49AE61DA7A81BC0'::geography)))
        Filter: (((status)::text = 'ACTIVE'::text) AND ((gender)::text = 'MALE'::text) AND (((address_point IS NOT NULL) AND (address_point && '0101000020E6100000744694F606E75A40D49AE61DA7A81BC0'::geography) AND ('0101000020E6100000744694F606E75A40D49AE61DA7A81BC0'::geography && _st_expand(address_point, '100000'::double precision)) AND _st_dwithin(address_point, '0101000020E6100000744694F606E75A40D49AE61DA7A81BC0'::geography, '100000'::double precision, false)) OR ((hometown_point IS NOT NULL) AND (hometown_point && '0101000020E6100000744694F606E75A40D49AE61DA7A81BC0'::geography) AND ('0101000020E6100000744694F606E75A40D49AE61DA7A81BC0'::geography && _st_expand(hometown_point, '100000'::double precision)) AND _st_dwithin(hometown_point, '0101000020E6100000744694F606E75A40D49AE61DA7A81BC0'::geography, '100000'::double precision, false))))
        Rows Removed by Filter: 3323
        Heap Blocks: exact=7014
        ->  BitmapOr  (cost=2.83..2.83 rows=1 width=0) (actual time=1716.425..1716.425 rows=0 loops=1)
              ->  Bitmap Index Scan on ik_matchprofile_address_point  (cost=0.00..1.42 rows=1 width=0) (actual time=1167.698..1167.698 rows=16086 loops=1)
                    Index Cond: ((address_point IS NOT NULL) AND (address_point && '0101000020E6100000744694F606E75A40D49AE61DA7A81BC0'::geography))
              ->  Bitmap Index Scan on ik_matchprofile_hometown_point  (cost=0.00..1.42 rows=1 width=0) (actual time=548.723..548.723 rows=7846 loops=1)
                    Index Cond: ((hometown_point IS NOT NULL) AND (hometown_point && '0101000020E6100000744694F606E75A40D49AE61DA7A81BC0'::geography))
Planning time: 47.366 ms
Execution time: 2011.429 ms

20000 সারি টেবিল, &&এবং ST_Expand(box2d)300 আইওপিএস সহ এডাব্লুএস আরডিএস 512 এমবি র‌্যামে:

Aggregate  (cost=3.85..3.86 rows=1 width=8) (actual time=584.346..584.346 rows=1 loops=1)
  ->  Bitmap Heap Scan on matchprofile  (cost=2.83..3.85 rows=1 width=0) (actual time=555.048..584.083 rows=1154 loops=1)
        Recheck Cond: (((address_point IS NOT NULL) AND (address_point && '0103000020E61000000100000005000000744694F606C75A40D49AE61DA7A81DC0744694F606C75A40D49AE61DA7A819C0744694F606075B40D49AE61DA7A819C0744694F606075B40D49AE61DA7A81DC0744694F606C75A40D49AE61DA7A81DC0'::geography)) OR ((hometown_point IS NOT NULL) AND (hometown_point && '0103000020E61000000100000005000000744694F606C75A40D49AE61DA7A81DC0744694F606C75A40D49AE61DA7A819C0744694F606075B40D49AE61DA7A819C0744694F606075B40D49AE61DA7A81DC0744694F606C75A40D49AE61DA7A81DC0'::geography)))
        Filter: (((status)::text = 'ACTIVE'::text) AND ((gender)::text = 'MALE'::text))
        Rows Removed by Filter: 555
        Heap Blocks: exact=3812
        ->  BitmapOr  (cost=2.83..2.83 rows=1 width=0) (actual time=553.091..553.091 rows=0 loops=1)
              ->  Bitmap Index Scan on ik_matchprofile_address_point  (cost=0.00..1.42 rows=1 width=0) (actual time=413.074..413.074 rows=4850 loops=1)
                    Index Cond: ((address_point IS NOT NULL) AND (address_point && '0103000020E61000000100000005000000744694F606C75A40D49AE61DA7A81DC0744694F606C75A40D49AE61DA7A819C0744694F606075B40D49AE61DA7A819C0744694F606075B40D49AE61DA7A81DC0744694F606C75A40D49AE61DA7A81DC0'::geography))
              ->  Bitmap Index Scan on ik_matchprofile_hometown_point  (cost=0.00..1.42 rows=1 width=0) (actual time=140.014..140.014 rows=3100 loops=1)
                    Index Cond: ((hometown_point IS NOT NULL) AND (hometown_point && '0103000020E61000000100000005000000744694F606C75A40D49AE61DA7A81DC0744694F606C75A40D49AE61DA7A819C0744694F606075B40D49AE61DA7A819C0744694F606075B40D49AE61DA7A81DC0744694F606C75A40D49AE61DA7A81DC0'::geography))
Planning time: 0.673 ms
Execution time: 584.386 ms

আবার সহজ জিজ্ঞাসা সহ:

20000 সারি টেবিল, ST_DWithin(geography, geography, 100000, FALSE)300 আইওপিএস সহ এডাব্লুএস আরডিএস 512 এমবি র‌্যামে:

Aggregate  (cost=4.60..4.61 rows=1 width=8) (actual time=36.448..36.448 rows=1 loops=1)
  ->  Bitmap Heap Scan on matchprofile  (cost=2.83..4.60 rows=1 width=0) (actual time=7.694..35.545 rows=2982 loops=1)
        Recheck Cond: (((address_point IS NOT NULL) AND (address_point && '0101000020E6100000744694F606E75A40D49AE61DA7A81BC0'::geography)) OR ((hometown_point IS NOT NULL) AND (hometown_point && '0101000020E6100000744694F606E75A40D49AE61DA7A81BC0'::geography)))
        Filter: (((address_point IS NOT NULL) AND (address_point && '0101000020E6100000744694F606E75A40D49AE61DA7A81BC0'::geography) AND ('0101000020E6100000744694F606E75A40D49AE61DA7A81BC0'::geography && _st_expand(address_point, '100000'::double precision)) AND _st_dwithin(address_point, '0101000020E6100000744694F606E75A40D49AE61DA7A81BC0'::geography, '100000'::double precision, true)) OR ((hometown_point IS NOT NULL) AND (hometown_point && '0101000020E6100000744694F606E75A40D49AE61DA7A81BC0'::geography) AND ('0101000020E6100000744694F606E75A40D49AE61DA7A81BC0'::geography && _st_expand(hometown_point, '100000'::double precision)) AND _st_dwithin(hometown_point, '0101000020E6100000744694F606E75A40D49AE61DA7A81BC0'::geography, '100000'::double precision, true)))
        Rows Removed by Filter: 2322
        Heap Blocks: exact=2947
        ->  BitmapOr  (cost=2.83..2.83 rows=1 width=0) (actual time=7.197..7.197 rows=0 loops=1)
              ->  Bitmap Index Scan on ik_matchprofile_address_point  (cost=0.00..1.41 rows=1 width=0) (actual time=5.265..5.265 rows=5680 loops=1)
                    Index Cond: ((address_point IS NOT NULL) AND (address_point && '0101000020E6100000744694F606E75A40D49AE61DA7A81BC0'::geography))
              ->  Bitmap Index Scan on ik_matchprofile_hometown_point  (cost=0.00..1.41 rows=1 width=0) (actual time=1.930..1.930 rows=2743 loops=1)
                    Index Cond: ((hometown_point IS NOT NULL) AND (hometown_point && '0101000020E6100000744694F606E75A40D49AE61DA7A81BC0'::geography))
Planning time: 0.479 ms
Execution time: 36.512 ms

20000 সারি টেবিল, &&এবং ST_Expand(box2d)300 আইওপিএস সহ এডাব্লুএস আরডিএস 512 এমবি র‌্যামে:

Aggregate  (cost=3.84..3.85 rows=1 width=8) (actual time=6.263..6.264 rows=1 loops=1)
  ->  Bitmap Heap Scan on matchprofile  (cost=2.83..3.84 rows=1 width=0) (actual time=4.295..5.864 rows=1711 loops=1)
        Recheck Cond: (((address_point IS NOT NULL) AND (address_point && '0103000020E61000000100000005000000744694F606C75A40D49AE61DA7A81DC0744694F606C75A40D49AE61DA7A819C0744694F606075B40D49AE61DA7A819C0744694F606075B40D49AE61DA7A81DC0744694F606C75A40D49AE61DA7A81DC0'::geography)) OR ((hometown_point IS NOT NULL) AND (hometown_point && '0103000020E61000000100000005000000744694F606C75A40D49AE61DA7A81DC0744694F606C75A40D49AE61DA7A819C0744694F606075B40D49AE61DA7A819C0744694F606075B40D49AE61DA7A81DC0744694F606C75A40D49AE61DA7A81DC0'::geography)))
        Heap Blocks: exact=1419
        ->  BitmapOr  (cost=2.83..2.83 rows=1 width=0) (actual time=4.122..4.122 rows=0 loops=1)
              ->  Bitmap Index Scan on ik_matchprofile_address_point  (cost=0.00..1.41 rows=1 width=0) (actual time=3.018..3.018 rows=1693 loops=1)
                    Index Cond: ((address_point IS NOT NULL) AND (address_point && '0103000020E61000000100000005000000744694F606C75A40D49AE61DA7A81DC0744694F606C75A40D49AE61DA7A819C0744694F606075B40D49AE61DA7A819C0744694F606075B40D49AE61DA7A81DC0744694F606C75A40D49AE61DA7A81DC0'::geography))
              ->  Bitmap Index Scan on ik_matchprofile_hometown_point  (cost=0.00..1.41 rows=1 width=0) (actual time=1.102..1.102 rows=980 loops=1)
                    Index Cond: ((hometown_point IS NOT NULL) AND (hometown_point && '0103000020E61000000100000005000000744694F606C75A40D49AE61DA7A81DC0744694F606C75A40D49AE61DA7A819C0744694F606075B40D49AE61DA7A819C0744694F606075B40D49AE61DA7A81DC0744694F606C75A40D49AE61DA7A81DC0'::geography))
Planning time: 0.399 ms
Execution time: 6.306 ms

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