আমি নীচের প্রশ্নের জন্য কর্মক্ষমতা উন্নত করার চেষ্টা করছি। আমি কীভাবে প্রশ্নটি লিখি তা বিবেচনা করেই নয় (কাউন্টি = 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
pointসারিগুলিকে একটি নতুন টেবিলের মধ্যে কাউন্টি = 24 অনুলিপি করি তখন কোয়েরিটি 724 এর তুলনায় কেবল .453ms লাগে তাই অবশ্যই বড় পার্থক্য রয়েছে।
count(*)স্টাইলের বিষয়টি হিসাবে ব্যবহার করা উচিত । যদি idআপনি বলেন যে কোনও পকিড হয় তবে এর NOT NULLঅর্থ হ'ল তারা একই। স্বল্পতা ব্যতীত count(id)আপনার যদি সেই প্রশ্নটি জিজ্ঞাসা করতে হয় তবে idযদি উত্তরনীয় হয়।