এরউইন, যেহেতু এটি পূর্বের মন্তব্য থ্রেডে আমাদের আলোচনার বিষয় ছিল, তাই আমি এটিকে আরও কিছুটা সামনে ঠোকরানোর সিদ্ধান্ত নিয়েছি ...
যুক্তিসঙ্গত আকারের টেবিল থেকে আমার খুব সাধারণ প্রশ্ন রয়েছে। আমার সাধারণত পর্যাপ্ত পরিমাণ থাকে work_memতবে এই ক্ষেত্রে আমি কমান্ডগুলি ব্যবহার করি
SET work_mem = 64;
একটি খুব ছোট সেট work_memএবং
SET work_mem = default;
work_memআমার জিজ্ঞাসার জন্য যথেষ্ট পরিমাণে পিছনে সেট করতে।
শর্তটি ব্যাখ্যা করুন এবং পুনরায় পরীক্ষা করুন
সুতরাং, আমার জিজ্ঞাসা কেবল EXPLAINহিসাবে চালানো
EXPLAIN
SELECT * FROM olap.reading_facts
WHERE meter < 20;
আমি নিম্ন এবং উচ্চ উভয়ের জন্য ফলাফল পেয়েছি work_mem:
কম work_mem
Bitmap Heap Scan on reading_facts (cost=898.92..85632.60 rows=47804 width=32)
Recheck Cond: (meter < 20)
-> Bitmap Index Scan on idx_meter_reading_facts (cost=0.00..886.96 rows=47804 width=0)
Index Cond: (meter < 20)
উচ্চ work_mem
Bitmap Heap Scan on reading_facts (cost=898.92..85632.60 rows=47804 width=32)
Recheck Cond: (meter < 20)
-> Bitmap Index Scan on idx_meter_reading_facts (cost=0.00..886.96 rows=47804 width=0)
Index Cond: (meter < 20)
দীর্ঘ গল্প সংক্ষিপ্ত, EXPLAINকেবল হিসাবে, যেমনটি প্রত্যাশিত ক্যোয়ারী পরিকল্পনাটি ইঙ্গিত করে যে একটি পুনর্বার শর্ত সম্ভব, তবে আমরা জানি না যে আসলে গণনা করা হবে কিনা।
বিশ্লেষণ এবং পুনরায় পরীক্ষা শর্ত ব্যাখ্যা করুন
যখন আমরা ANALYZEক্যোয়ারিতে অন্তর্ভুক্ত করি , ফলাফলগুলি আমাদের কী জানা দরকার তা সম্পর্কে আমাদের জানায়।
কম work_mem
Bitmap Heap Scan on reading_facts (cost=898.92..85632.60 rows=47804 width=32) (actual time=3.130..13.946 rows=51840 loops=1)
Recheck Cond: (meter < 20)
Rows Removed by Index Recheck: 86727
Heap Blocks: exact=598 lossy=836
-> Bitmap Index Scan on idx_meter_reading_facts (cost=0.00..886.96 rows=47804 width=0) (actual time=3.066..3.066 rows=51840 loops=1)
Index Cond: (meter < 20)
উচ্চ work_mem
Bitmap Heap Scan on reading_facts (cost=898.92..85632.60 rows=47804 width=32) (actual time=2.647..7.247 rows=51840 loops=1)
Recheck Cond: (meter < 20)
Heap Blocks: exact=1434
-> Bitmap Index Scan on idx_meter_reading_facts (cost=0.00..886.96 rows=47804 width=0) (actual time=2.496..2.496 rows=51840 loops=1)
Index Cond: (meter < 20)
আবার প্রত্যাশা মতো, অন্তর্ভুক্তি ANALYZEআমাদের কাছে কিছু অত্যন্ত গুরুত্বপূর্ণ তথ্য প্রকাশ করে। নিম্ন work_memক্ষেত্রে, আমরা দেখতে পেলাম যে সূচি পুনরায় পরীক্ষা করে সারিগুলি সরিয়ে ফেলা হয়েছে এবং আমাদের lossyহিপ ব্লক রয়েছে।
উপসংহার? (বা উহার অভাব)
দুর্ভাগ্যক্রমে, দেখে মনে হচ্ছে EXPLAINএটি নিজের মতো করেই যথেষ্ট নয় যে কোনও সূচক পুনরায় পরীক্ষা করা প্রয়োজন হবে কি না কারণ বিটম্যাপ হিপ স্ক্যানের সময় সারি আইডির কিছু পৃষ্ঠাগুলি ধরে রাখার পক্ষে ফেলে দেওয়া হচ্ছে।
EXPLAIN ANALYZEমাঝারি দৈর্ঘ্যের ক্যোয়ারীগুলি সহ সমস্যাগুলি নির্ণয়ের জন্য ব্যবহার করা ভাল, তবে যদি কোনও ক্যোয়ারীটি সম্পূর্ণ হতে খুব দীর্ঘ সময় নেয়, তবে EXPLAIN ANALYZEআপনার বিটম্যাপ সূচকটি অপরতার কারণে ক্ষয়িকার্তে রূপান্তরিত হচ্ছে তা আবিষ্কার work_memকরা এখনও একটি জটিল বাধা। আমি চাই EXPLAINটেবিলের পরিসংখ্যান থেকে এই ঘটনার সম্ভাবনাটি অনুমান করার কোনও উপায় ছিল ।