স্থানিক কার্যক্রমে সীমা সীমাবদ্ধ করুন


9

আমি নীচের প্রশ্নের জন্য কর্মক্ষমতা উন্নত করার চেষ্টা করছি। আমি কীভাবে প্রশ্নটি লিখি তা বিবেচনা করেই নয় (কাউন্টি = 24 যেখানে কেবল 60০ টি সারি রয়েছে, যদিও পোস্টগ্রিজ ব্যয়বহুল ST_DWITHIN ফাংশনটির মাধ্যমে সমস্ত ~ 570K সারি চালানোর জন্য জোর দিয়ে থাকে) y আমার কাছে আরও দ্রুত এবং আরও দক্ষ হবে বলে মনে হচ্ছে এমন পোস্টজি ফানকের মধ্য দিয়ে চলার আগে আমি কাউন্টিতে = ২৪ ফিল্টার করার জন্য পোস্টগ্রিজ কীভাবে পেতে পারি? 700 মিমি খুব বেশি উদ্বেগের কারণ নয় তবে এই টেবিলটি 10 ​​এম + পর্যন্ত বাড়তে থাকে আমি পারফরম্যান্স সম্পর্কে উদ্বিগ্ন।

এছাড়াও লক্ষণীয়, p.id একটি প্রাথমিক কী, p.zipcode একটি fk সূচক, z.county একটি fk সূচক, এবং p.geom এর একটি জিআইএসটি সূচক রয়েছে।

প্রশ্ন:

EXPLAIN ANALYZE
  SELECT count(p.id)
  FROM point AS p
  LEFT JOIN zipcode AS z
    ON p.zipcode = z.zipcode
  WHERE z.county = 24
    AND ST_DWithin(
      p.geom, 
      ST_SetSRID(ST_Point(-121.479756008715,38.563236291512),4269), 
      16090.0,
      false
    )

বিশ্লেষণ ব্যাখ্যা করুন:

Aggregate  (cost=250851.91..250851.92 rows=1 width=4) (actual time=724.007..724.007 rows=1 loops=1)
  ->  Hash Join  (cost=152.05..250851.34 rows=228 width=4) (actual time=0.359..723.996 rows=51 loops=1)
        Hash Cond: ((p.zipcode)::text = (z.zipcode)::text)
        ->  Seq Scan on point p  (cost=0.00..250669.12 rows=7437 width=10) (actual time=0.258..723.867 rows=63 loops=1)
              Filter: (((geom)::geography && '0101000020AD10000063DF8B52B45E5EC070FB752018484340'::geography) AND ('0101000020AD10000063DF8B52B45E5EC070FB752018484340'::geography && _st_expand((geom)::geography, 16090::double precision)) AND _st_dwithin((g (...)
              Rows Removed by Filter: 557731
        ->  Hash  (cost=151.38..151.38 rows=54 width=6) (actual time=0.095..0.095 rows=54 loops=1)
              Buckets: 1024  Batches: 1  Memory Usage: 3kB
              ->  Bitmap Heap Scan on zipcode z  (cost=4.70..151.38 rows=54 width=6) (actual time=0.023..0.079 rows=54 loops=1)
                    Recheck Cond: (county = 24)
                    Heap Blocks: exact=39
                    ->  Bitmap Index Scan on fki_zipcode_county_foreign_key  (cost=0.00..4.68 rows=54 width=0) (actual time=0.016..0.016 rows=54 loops=1)
                          Index Cond: (county = 24)
Planning time: 0.504 ms
Execution time: 724.064 ms

হতে পারে "পয়েন্ট হিসাবে পয়েন্ট হিসাবে পয়েন্ট হিসাবে পয়েন্ট হিসাবে পয়েন্ট হিসাবে পয়েন্ট হিসাবে পয়েন্ট হিসাবে পয়েন্ট হিসাবে পয়েন্ট" (zipcode.county = 24) z হিসাবে "জিপকোড থেকে নির্বাচন করুন?"
weiji14

শুধু এটি চেষ্টা, একই ফলাফল। আমি যখন ~ 60 টি pointসারিগুলিকে একটি নতুন টেবিলের মধ্যে কাউন্টি = 24 অনুলিপি করি তখন কোয়েরিটি 724 এর তুলনায় কেবল .453ms লাগে তাই অবশ্যই বড় পার্থক্য রয়েছে।
জোশ

1
আপনার count(*)স্টাইলের বিষয়টি হিসাবে ব্যবহার করা উচিত । যদি idআপনি বলেন যে কোনও পকিড হয় তবে এর NOT NULLঅর্থ হ'ল তারা একই। স্বল্পতা ব্যতীত count(id)আপনার যদি সেই প্রশ্নটি জিজ্ঞাসা করতে হয় তবে idযদি উত্তরনীয় হয়।
ইভান ক্যারল

1
আমি জিজ্ঞাসা করতে পারি আপনি বাম বাইরের যোগদান কেন ব্যবহার করছেন? এটি কোনও অভ্যন্তরীণ যোগদানের পরিবর্তনে চেষ্টা করুন ... ফলাফলগুলি অভিন্ন হওয়া উচিত
মিকিটি

যদি z.country সীমাবদ্ধ ফ্যাক্টর হয় তবে আমি আপনাকে প্রথমে সিটিই কোয়েরিতে রাখার পরামর্শ দিচ্ছি এবং তারপরে কেবল আপনার আগ্রহের বিষয়টির সাথে ছেদ করার জন্য সেই ফলাফলগুলি পরীক্ষা করে দেখুন। যেহেতু স্থানিক সূচকটি সম্ভবত কাউন্টি = 24 এর চেয়ে কম নির্বাচিত, তাই এটি কেবল পথেই চলেছে।
জন পাওয়েল

উত্তর:


3

আপনি প্রত্যাশিত বনাম প্রকৃত সারি গণনা সহ সমস্যাটি দেখতে পাচ্ছেন। পরিকল্পনাকারী মনে করেন যে এখানে 7,437 সারি রয়েছে, তবে কেবল 63৩ রয়েছে The পরিসংখ্যান বন্ধ রয়েছে। আকর্ষণীয়ভাবে যথেষ্ট, এটি কোনও সীমাবদ্ধ বাক্স সূচক (সূচক) অনুসন্ধান ব্যবহার করছে DWithinনা এর ফলাফলটি আপনি পেস্ট করতে পারেন \d point। PostGIS এবং PostgreSQL এর কোন সংস্করণ?

চালানোর চেষ্টা করুন ANALYZE point। আপনি যখন শর্তটি উপরে রাখেন তখন কি একই পরিকল্পনা পাবেন?

JOIN zipcode AS z
  ON p.zipcode = z.zipcode
  AND z.county = 24

আমি বিশ্লেষণ চালিয়েছি এবং ওএন-তে নতুন ও শর্তটি চেষ্টা করেছিলাম কিন্তু এখনও 700ms রান বার পাচ্ছি। এটি পিজিএসকিউএল 9.4 এবং পোস্টজিআইএস 2.2।
জোশ

2

পার্শ্ব নোট হিসাবে, যুক্তিসঙ্গত সম্ভাবনা রয়েছে যে PostGIS 2.3.0 এ এই আচরণটি পরিবর্তন করা হয়েছে যদি আপনি এটিকে কোনও বাগ বলতে চান call

PostgreSQL এ থাকা দস্তাবেজগুলি থেকে

Cpu_operator_cost এর ইউনিটগুলিতে ফাংশনের জন্য আনুমানিক নির্ধারিত ব্যয় প্রদান করে এমন একটি ধনাত্মক সংখ্যা। যদি ফাংশনটি কোনও সেট দেয়, তবে এটি প্রত্যাবর্তিত সারিতে ব্যয়। যদি ব্যয়টি নির্দিষ্ট না করা হয়, সি-ভাষা এবং অভ্যন্তরীণ ফাংশনগুলির জন্য 1 ইউনিট এবং অন্যান্য সমস্ত ভাষায় ফাংশনের জন্য 100 ইউনিট ধরে নেওয়া হয়। বৃহত্তর মানগুলির কারণে পরিকল্পনাকারী প্রয়োজনের তুলনায় প্রায়শই ফাংশনটির মূল্যায়ন এড়াতে চেষ্টা করে।

সুতরাং ডিফল্ট ব্যয় ছিল 1 (খুব সস্তা)। D_Withinজিআইএসটি সূচক ব্যবহার করা খুব সস্তা। তবে, তা বাড়িয়ে 100 করা হয়েছে (অভ্যন্তরীণ প্রক্সি দ্বারা _ST_DWithin)।

আমি নিজে সিটিই পদ্ধতির বিশাল ফ্যান নই। সিটিইগুলি একটি অপ্টিমাইজেশন বেড়া। সুতরাং এই জাতীয় ফ্যাশনে এটি করা ভবিষ্যতের অপ্টিমাইজেশনের কিছু সম্ভাব্য ঘর সরিয়ে দেয়। স্যানার ডিফল্ট যদি এটি ঠিক করে দেয় তবে আমি আপগ্রেড করব। দিন শেষে, আমরা কাজটি করতে চাই এবং সেই পদ্ধতিটি আপনার পক্ষে স্পষ্টভাবে কাজ করে।


1

জন পাওলের ইঙ্গিতকে ধন্যবাদ দিয়ে আমি কাউন্টিকে সীমাবদ্ধ শর্তটিকে একটি / সিটিই ক্যোয়ারিতে রাখার জন্য ক্যোয়ারীটি সংশোধন করেছিলাম এবং এই উন্নত সম্পাদনটি 222ms বনাম 700 তে বেশ কিছুটা করেছি। তথাপি যখন আছে তখনও .74 এমএস থেকে আমি অনেক দূরে কাঁদছি নিজস্ব টেবিল আমি এখনও নিশ্চিত নই যে পরিকল্পনাকারী কোনও ব্যয়বহুল পোস্টজিস ফাংশনটি চালানোর আগে ডেটা সেটটিকে কেন সীমাবদ্ধ করে না, এবং আমার কাছে যখন বড় ডেটাসেট রয়েছে সেগুলি চেষ্টা করে দেখতে হবে তবে এটি আপাতত এই অনন্য পরিস্থিতির সমাধান বলে মনে হচ্ছে।

with points as (
   select p.id, p.geom from point p inner join zipcode z
   on p.zipcode = z.zipcode
   where county = 24
   ) 


SELECT count(points.id)
FROM points
WHERE ST_DWITHIN(points.geom, (ST_SetSRID(ST_Point(-121.479756008715,38.563236291512),4269)), 16090.0, false)

1
আমাদের তিনটি ক্যোয়ারী পরিকল্পনা এবং টেবিলের জন্য স্কিমা দেখতে হবে (আমার উত্তর \ d পয়েন্টে অনুরোধ করা হয়েছে)।
ইভান ক্যারল

0

আপনার উপর একটি সূচি তৈরি করা উচিত zipcode(county, zipcode), এটি আপনাকে কেবলমাত্র z এ স্ক্যান করতে পারে।

এছাড়াও আপনি নিয়ে পরীক্ষা করতে পারেন btree_gistপারেন তৈরি এক্সটেনশন point(zipcode, geom)সূচক বা point(geom, zipcode)এবং zipcode(zipcode, county)সূচী।

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