বিটম্যাপ সূচক স্ক্যানের সাথে ক্যোয়ারী পরিকল্পনাগুলিতে "পুনরায় পরীক্ষা করুন:" লাইন


21

এটি পূর্ববর্তী প্রশ্নের মন্তব্যগুলি থেকে একটি স্পিন অফ:

PostgreSQL 9.4 ব্যবহার করে, Recheck Cond:কোয়েরি পরিকল্পনা অনুসারে বিটম্যাপ সূচক স্ক্যান করার পরে সর্বদা একটি লাইন বলে মনে হয় EXPLAIN

EXPLAINরেফারেন্সড প্রশ্নের আউটপুট মত :

->  Bitmap Heap Scan on table_three  (cost=2446.92..19686.74 rows=8159 width=7)
      Recheck Cond: (("timestamp" > (now() - '30 days'::interval)) AND (client_id > 0))
      ->  BitmapAnd  (cost=2446.92..2446.92 rows=8159 width=0)
            ->  Bitmap Index Scan on table_one_timestamp_idx  (cost=0.00..1040.00 rows=79941 width=0)
                  Index Cond: ("timestamp" > (now() - '30 days'::interval))
            ->  Bitmap Index Scan on fki_table_three_client_id  (cost=0.00..1406.05 rows=107978 width=0)
                  Index Cond: (client_id > 0)

অথবা EXPLAIN ANALYZEএকটি সাধারণ, বিশাল টেবিলের (খুব সামান্য সহ work_mem) আউটপুটটিতে :

EXPLAIN ANALYZE SELECT * FROM aa WHERE a BETWEEN 100000 AND 200000;
Bitmap Heap Scan on aa  (cost=107.68..4818.05 rows=5000 width=4) (actual time=27.629..213.606 rows=100001 loops=1)
  Recheck Cond: ((a >= 100000) AND (a <= 200000))
  Rows Removed by Index Recheck: 758222
  Heap Blocks: exact=693 lossy=3732
  ->  Bitmap Index Scan on aai  (cost=0.00..106.43 rows=5000 width=0) (actual time=27.265..27.265 rows=100001 loops=1)
        Index Cond: ((a >= 100000) AND (a <= 200000))

এর অর্থ কি বিটম্যাপ সূচক স্ক্যানের পরে দ্বিতীয়বার সূচক শর্তগুলি পরীক্ষা করতে হবে? আউটপুট
থেকে আমরা আর কী শিখতে পারি EXPLAIN?

উত্তর:


17

যেমন @ ক্রিস রেফারেন্স করা প্রশ্নটিতে সঠিক মন্তব্য করেছে :

সামান্য তদন্তে ইঙ্গিত পাওয়া যায় যে রিচেক শর্তটি সর্বদা প্রিন্টেড থাকে EXPLAINতবে বাস্তবে কেবল তখনই সঞ্চালিত হয় যখন work_memবিটম্যাপটি ক্ষতিকারক হয়ে যায়। থটস? http://www.postgresql.org/message-id/464F3C5D.2000700@enterprisedb.com

যদিও এটি সমস্ত সত্য এবং মূল বিকাশকারী হাইক্কি লিন্নাকঙ্গাস প্রথম শ্রেণীর উত্স, পোস্টটি 2007 সালের (পোস্টগ্রিস 8.2) থেকে আসে। এখানে মাইকেল পাউকিয়ারের একটি ব্লগ পোস্ট রয়েছে যা পোস্টগ্রিস 9.4-এর বিশদ ব্যাখ্যার সাথে রয়েছে , যেখানে EXPLAIN ANALYZEআরও তথ্যের সাথে আউটপুট উন্নত করা হয়েছে।

Recheck Cond:লাইন সবসময় সেখানে বিটম্যাপ সূচক স্ক্যান জন্য। বেসিকের আউটপুট EXPLAINআমাদের আরও বলবে না। আমরা EXPLAIN ANALYZEদ্বিতীয় তথ্য হিসাবে প্রশ্নের দ্বিতীয় উদ্ধৃতি থেকে দেখা যাবে হিসাবে অতিরিক্ত তথ্য পেতে :

Heap Blocks: exact=693 lossy=3732

4425 তথ্য পৃষ্ঠা (ব্লক), 693 সঞ্চিত tuples মোট থেকে ঠিক (tuple পয়েন্টার সহ) যখন অন্যান্য 3732 পৃষ্ঠাগুলি ছিল লজি বিটম্যাপ মধ্যে (ঠিক ডেটা পৃষ্ঠা)। work_memসূচক স্ক্যান থেকে তৈরি পুরো বিটম্যাপটি ঠিকঠাক (লসলেস) সংরক্ষণ করার মতো যথেষ্ট বড় না হলে এটি ঘটে ।

ক্ষতির অংশীদারদের থেকে পৃষ্ঠাগুলির জন্য সূচক শর্তটি পুনরায় পরীক্ষা করতে হবে, কারণ বিটম্যাপটি কেবল কোন পৃষ্ঠাগুলি আনতে হবে এবং পৃষ্ঠায় সঠিক টিপলগুলি নয় তা মনে রাখে। না পৃষ্ঠাতে সকল tuples অগত্যা সূচক অবস্থার পাস হবে, এটা প্রয়োজন থেকে আসলে শর্ত আবার পরীক্ষা।

এটি pgsql হ্যাকারগুলির থ্রেড যেখানে নতুন সংযোজনটি নিয়ে আলোচনা করা হয়েছিল । ক্ষতিকারক বিটম্যাপ এন্ট্রি এবং পরবর্তী অবস্থার পুনরুদ্ধারগুলি এড়াতে কীভাবে সর্বনিম্ন গণনা করা যায় তার জন্য লেখক এতুসু ফুজিটা একটি সূত্র সরবরাহwork_mem করেছেন। একাধিক বিটম্যাপ স্ক্যানযুক্ত জটিল ক্ষেত্রে গণনা নির্ভরযোগ্য নয়, সুতরাং এটি থেকে প্রকৃত সংখ্যাগুলি আউটপুট দেওয়ার জন্য ব্যবহৃত হয়নি EXPLAIN। এটি এখনও সহজ ক্ষেত্রেগুলির জন্য অনুমান হিসাবে কাজ করতে পারে।

অতিরিক্ত লাইন BUFFERS:

এছাড়াও, BUFFERSবিকল্পের সাথে চলাকালীন : EXPLAIN (ANALYZE, BUFFERS) ...অন্য একটি লাইন যুক্ত করা হয়:

Buffers: shared hit=279 read=79

এটি নির্দেশ করে যে অন্তর্নিহিত টেবিলটি (এবং সূচক) ক্যাশে ( shared hit=279) থেকে পড়েছিল এবং ডিস্ক ( read=79) থেকে কী পরিমাণ আনতে হয়েছিল । আপনি যদি ক্যোয়ারির পুনরাবৃত্তি করেন তবে "পঠিত" অংশটি সাধারণত খুব বেশি না-পাওয়া বিশাল প্রশ্নের জন্য অদৃশ্য হয়ে যায়, কারণ প্রথম কলের পরে সবকিছু এখন ক্যাশে is প্রথম কল আপনাকে জানায় যে ইতিমধ্যে কতটা ক্যাশে হয়েছিল। পরবর্তী কলের মাধ্যমে আপনার ক্যাশে (বর্তমানে) কতটা পরিচালনা করতে পারে তা দেখায়।

আরও বিকল্প আছে। বিকল্প সম্পর্কে ম্যানুয়াল BUFFERS:

বিশেষত, হিট, রিড, ডিরিটিড, এবং লিখিত ভাগ হওয়া ব্লকগুলির সংখ্যা অন্তর্ভুক্ত করুন, হিট, রিড, ডিরিটিড, এবং লিখিত এবং টেম্প ব্লকগুলির সংখ্যা এবং পড়া লিখিত সংখ্যা অন্তর্ভুক্ত করুন।

পড়ুন, আরও আছে। উত্স কোডে
আউটপুট বিকল্পগুলির তালিকা এখানে ।


10

এরউইন, যেহেতু এটি পূর্বের মন্তব্য থ্রেডে আমাদের আলোচনার বিষয় ছিল, তাই আমি এটিকে আরও কিছুটা সামনে ঠোকরানোর সিদ্ধান্ত নিয়েছি ...

যুক্তিসঙ্গত আকারের টেবিল থেকে আমার খুব সাধারণ প্রশ্ন রয়েছে। আমার সাধারণত পর্যাপ্ত পরিমাণ থাকে 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টেবিলের পরিসংখ্যান থেকে এই ঘটনার সম্ভাবনাটি অনুমান করার কোনও উপায় ছিল ।

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