"বিটম্যাপ হ্যাপ স্ক্যান" এবং "বিটম্যাপ সূচক স্ক্যান" বোঝা


36

আমি নিম্নলিখিত উদাহরণ দিয়ে আমার ভুল বোঝাবুঝির ব্যাখ্যা করার চেষ্টা করব।

বুঝলাম না মৌলিক এর Bitmap Heap Scan Node। কোয়েরিটি SELECT customerid, username FROM customers WHERE customerid < 1000 AND username <'user100';এর পরিকল্পনাটি বিবেচনা করুন :

Bitmap Heap Scan on customers  (cost=25.76..61.62 rows=10 width=13) (actual time=0.077..0.077 rows=2 loops=1)
  Recheck Cond: (((username)::text < 'user100'::text) AND (customerid < 1000))
  ->  BitmapAnd  (cost=25.76..25.76 rows=10 width=0) (actual time=0.073..0.073 rows=0 loops=1)
        ->  Bitmap Index Scan on ix_cust_username  (cost=0.00..5.75 rows=200 width=0) (actual time=0.006..0.006 rows=2 loops=1)
              Index Cond: ((username)::text < 'user100'::text)
        ->  Bitmap Index Scan on customers_pkey  (cost=0.00..19.75 rows=1000 width=0) (actual time=0.065..0.065 rows=999 loops=1)
              Index Cond: (customerid < 1000)

এই নোড সম্পর্কে আমার বোঝার :

যেমনটি এখানে ব্যাখ্যা করা হয়েছে , bitmap heap scanপাঠ্যগুলি ক্রমানুসারে ক্রমগুলি টেবিলটিকে ব্লক করে, সুতরাং এটি এলোমেলো-টেবিল-অ্যাক্সেসের ওভারহেড উত্পাদন করে না যা ঠিক করার মতো ঘটে Index Scan

কাজ শেষ Index Scanহয়ে যাওয়ার পরে , পোস্টগ্রিসকিউএল জেনে নেই কীভাবে সারিগুলি আনতে হয়, অযৌক্তিকতা এড়াতে heap blocks reads(বা hitsকোনও গরম ক্যাশে থাকলে)। সুতরাং এটি জিনিসটা বের করে গঠন (উত্পন্ন Bitmap Index Scan) নামক bitmapযা আমার ক্ষেত্রে ইনডেক্স দুই বিটম্যাপ উৎপাদিত এবং সম্পাদন দ্বারা তৈরি করা হচ্ছে BITWISE AND। যেহেতু বিটম্যাপটি তৈরি করা হয়েছে এখন অপ্রয়োজনীয়তা এড়াতে একটি সিক্যুয়াল ক্রমে টেবিলটি অনুকূলভাবে পড়তে পারে heap I/O-operations

এটি সেই জায়গা যেখানে অনেক প্রশ্ন আসে।

প্রশ্ন: আমাদের কেবল একটি বিটম্যাপ রয়েছে। পোস্টগ্র্রেএসকিউএল কীভাবে সারিগুলির শারীরিক ক্রম সম্পর্কে কিছু বিটম্যাপ করে জানে? বা বিটম্যাপ তৈরি করে যাতে এর কোনও উপাদান সহজেই কোনও পৃষ্ঠায় পয়েন্টারে ম্যাপ করা যায়? যদি তাই হয় তবে এটি সবকিছু ব্যাখ্যা করে তবে এটি কেবল আমার অনুমান।

সুতরাং, আমরা কি সহজভাবে বলতে পারি যে এটি bitmap heap scan -> bitmap index scanএকটি সিক্যুয়াল স্ক্যানের মতো তবে কেবল টেবিলের উপযুক্ত অংশের?



@ ক্রেইগ্রিঞ্জার মনে হয় আমি যা বুঝি না তা সঠিকভাবে ব্যাখ্যা করিনি। অবশ্যই, আপনি যেমন ব্যাখ্যা করেছেন আমাদের একটি বিটম্যাপ রয়েছে যার মাধ্যমে পোস্টগ্রেএসকিউএল যথাযথভাবে সারণীটি পড়ে। আমি বুঝতে পারি না এটি কীভাবে নির্দিষ্ট বিটম্যাপ দ্বারা মনোনীত প্রকৃত ব্লকটি সনাক্ত করতে পারে 001001010101011010101। বা এটি আসলে কোনও বিষয় নয় এবং আমাদের কেবলমাত্র এটি জানতে হবে এটি কেবলমাত্র দ্রুতগতিতে বিটম্যাপের মাধ্যমে একটি ব্লক খুঁজে পেতে পারে ...?
সেন্ট অ্যান্টারিও

আহ, আপনি "বিটম্যাপ" এর অর্থ এখানে ভুল বুঝে চলেছেন। আমাকে একটি সম্পাদনা অনুসরণ করুন।
ক্রেগ রিঞ্জার

@CraigRinger হয়তো, আমি থেকে defintion নেন সেখানে
সেন্ট অ্যান্টারিও

উত্তর:


52

পোস্টগ্র্রেএসকিউএল কীভাবে সারিগুলির শারীরিক ক্রম সম্পর্কে কিছু বিটম্যাপ করে জানে?

বিটম্যাপটি হিপ পৃষ্ঠায় এক বিট। বিটম্যাপ সূচক স্ক্যান সূচিপত্রের সূচী সূচী প্রবেশের পয়েন্টের ভিত্তিতে বিট সেট করে।

সুতরাং যখন এটি বিটম্যাপ হিপ স্ক্যান করতে যায়, এটি কেবল একটি লিনিয়ার টেবিল স্ক্যান করে, এটি কোনও নির্দিষ্ট পৃষ্ঠায় বিরক্ত করা উচিত বা এটি অনুসন্ধান করা উচিত কিনা তা দেখতে বিটম্যাপটি পড়ে।

বা বিটম্যাপ তৈরি করে যাতে এর কোনও উপাদান সহজেই কোনও পৃষ্ঠায় পয়েন্টারে ম্যাপ করা যায়?

না, বিটম্যাপ পৃষ্ঠাগুলি হ্যাপ করতে 1: 1 এর সাথে সম্পর্কিত।

আমি এখানে আরও কিছু লিখেছি ।


ঠিক আছে, দেখে মনে হচ্ছে আপনি এই প্রসঙ্গে "বিটম্যাপ" অর্থ কী তা ভুল বোঝাবুঝি করছেন।

এটি "101011" এর মতো কিছুটা স্ট্রিং নয় যা প্রতিটি হ্যাপ পৃষ্ঠার জন্য তৈরি করা হয়েছে, বা প্রতিটি সূচি পঠনযোগ্য বা যাই হোক না কেন।

পুরো বিটম্যাপটি একক বিট অ্যারে , সম্পর্কের ক্ষেত্রে হ্যাপ পৃষ্ঠাগুলি যত স্ক্যান করা হচ্ছে তত পরিমাণ বিট রয়েছে।

একটি বিটম্যাপ প্রথম সূচক স্ক্যান দ্বারা তৈরি করা হয়, সমস্ত এন্ট্রি 0 (মিথ্যা) দিয়ে শুরু করে। অনুসন্ধানের শর্তের সাথে মেলে এমন কোনও সূচক এন্ট্রি পাওয়া গেলেও সেই সূচী প্রবেশের দ্বারা চিহ্নিত হিপ ঠিকানাটি বিটম্যাপে একটি অফসেট হিসাবে দেখানো হয় এবং সেই বিটটি 1 (সত্য) এ সেট থাকে। সুতরাং সরাসরি হ্যাপ পৃষ্ঠাটি দেখার চেয়ে বরং বিটম্যাপ সূচক স্ক্যানটি বিটম্যাপে সংশ্লিষ্ট বিট অবস্থানটি দেখায়।

দ্বিতীয় এবং পরবর্তী বিটম্যাপ সূচক স্ক্যানগুলি অন্যান্য সূচীগুলি এবং সেগুলিতে অনুসন্ধানের অবস্থার সাথে একই কাজ করে।

তারপরে প্রতিটি বিটম্যাপ একসাথে অ্যান্ডেড is ফলস্বরূপ বিটম্যাপে প্রতিটি হ্যাপ পৃষ্ঠার জন্য একটি বিট থাকে, যেখানে বিটগুলি তখনই সত্য হয় যদি সেগুলি সমস্ত পৃথক বিটম্যাপ সূচক স্ক্যানগুলিতে সত্য হয়, অর্থাত প্রতিটি শঙ্কার স্ক্যানের সাথে অনুসন্ধানের শর্তটি মিলে যায়। এগুলি কেবলমাত্র লোড এবং পরীক্ষার জন্য আমাদের হ'ল হিপ পেজগুলির প্রয়োজন। যেহেতু প্রতিটি হ্যাপ পৃষ্ঠায় একাধিক সারি থাকতে পারে, তারপরে আমাদের প্রতিটি সারি পরীক্ষা করতে হবে এটি দেখতে সমস্ত শর্তের সাথে মেলে কিনা - এটিই "পুনরায় পরীক্ষা কর্ড" অংশটি রয়েছে।

এই সমস্ত কিছুর সাথে বোঝার একটি গুরুত্বপূর্ণ বিষয় হ'ল একটি সূচী এন্ট্রিতে টুপল ঠিকানাটি সারিটির দিকে নির্দেশ করে ctid, যা হিপ পৃষ্ঠার নম্বর এবং হিপ পৃষ্ঠার মধ্যে অফসেটের সংমিশ্রণ। একটি বিটম্যাপ সূচক স্ক্যান অফসেটগুলি উপেক্ষা করে, যেহেতু এটি যে কোনওভাবেই পুরো পৃষ্ঠাটি চেক করবে এবং সেই পৃষ্ঠাটির কোনও সারি শর্তের সাথে মিলে যদি বিট সেট করে।


গ্রাফিকাল উদাহরণ

Heap, one square = one page:
+---------------------------------------------+
|c____u_____X___u___X_________u___cXcc______u_|
+---------------------------------------------+
Rows marked c match customers pkey condition.
Rows marked u match username condition.
Rows marked X match both conditions.


Bitmap scan from customers_pkey:
+---------------------------------------------+
|100000000001000000010000000000000111100000000| bitmap 1
+---------------------------------------------+
One bit per heap page, in the same order as the heap
Bits 1 when condition matches, 0 if not

Bitmap scan from ix_cust_username:
+---------------------------------------------+
|000001000001000100010000000001000010000000010| bitmap 2
+---------------------------------------------+

বিটম্যাপগুলি একবার তৈরি হয়ে গেলে এবং সেগুলি সম্পাদন করা হয়:

+---------------------------------------------+
|100000000001000000010000000000000111100000000| bitmap 1
|000001000001000100010000000001000010000000010| bitmap 2
 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
|000000000001000000010000000000000010000000000| Combined bitmap
+-----------+-------+--------------+----------+
            |       |              |
            v       v              v
Used to scan the heap only for matching pages:
+---------------------------------------------+
|___________X_______X______________X__________|
+---------------------------------------------+

বিটম্যাপ হ্যাপ স্ক্যান তারপরে প্রতিটি পৃষ্ঠার শুরুতে সন্ধান করে এবং পৃষ্ঠাটি পড়ে:

+---------------------------------------------+
|___________X_______X______________X__________|
+---------------------------------------------+
seek------->^seek-->^seek--------->^
            |       |              |
            ------------------------
            only these pages read

এবং প্রতিটি পঠিত পৃষ্ঠাটি তখন শর্তের বিরুদ্ধে পুনরায় চেক করা হয় যেহেতু প্রতি পৃষ্ঠায়> 1 সারি থাকতে পারে এবং অগত্যা সমস্ত শর্তের সাথে মেলে না।


আহ, বিটম্যাপটি পপুলেশন করে তারা বোঝাতে চেয়েছিল ।
সেন্ট আন্টারিও

@ সেন্ট অ্যান্টারিও আমি ব্যাখ্যা করার জন্য গ্রাফিক্স যুক্ত করেছি
ক্রেগ

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

1
সুতরাং আমাদের সমস্ত পৃষ্ঠাগুলি একটি ড্রাইভে রয়েছে। তদুপরি, সম্পর্কের ডেটা দুই বা ততোধিক ড্রাইভে ছড়িয়ে দেওয়া হতে পারে (সুতরাং সম্পর্কের পৃষ্ঠাগুলির কোনও রৈখিক ক্রম কল্পনা করা শক্ত ), সুতরাং পরবর্তী পৃষ্ঠার প্রকৃত অফসেট নির্ধারণ করা কঠিন is কারণ আমি বিশ্বাস করি যে "অফসেট" দ্বারা আপনি বোঝাচ্ছেন কোনও ড্রাইভের শারীরিক অবস্থানের সাথে সম্পর্কিত প্রকৃত শারীরিক অফসেট।
সেন্ট অ্যান্টারিও

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

3

পোস্টগ্রিএসকিউএল-এ বিটম্যাপ স্ক্যানের বিবরণের জন্য দয়া করে আমার ব্লগ পোস্টটি https://rajeevrastogi.blogspot.in/2018/02/bitmap-scan-in-postgresql.html?showComment=1518410565792#c4647352762092142586 পড়ুন ।

বিটম্যাপ স্ক্যানের সামগ্রিক দ্রুত কার্যকারিতা ওভারভিউ:

  1. বিটম্যাপ হিপ স্ক্যান বিটম্যাপ সূচক স্ক্যান থেকে একটি টিপল জিজ্ঞাসা করুন।

  2. বিটম্যাপ সূচক স্ক্যান শর্ত অনুযায়ী সূচকটি প্রায় একইভাবে সাধারণ সূচক স্ক্যানের মতো স্ক্যান করে। তবে হিপ ডেটার সাথে সম্পর্কিত টিআইডি (পৃষ্ঠার নং এবং এর মধ্যে অফসেট সমন্বিত) ফেরার পরিবর্তে এটি বিআইডেম্যাপে সেই টিআইডি যুক্ত করে। সাধারণ বোঝার জন্য, আপনি এই বিটম্যাপটিকে সমস্ত পৃষ্ঠার হ্যাশ (পৃষ্ঠা নংয়ের উপর ভিত্তি করে হ্যাশ) ধারণ করতে পারেন এবং প্রতিটি পৃষ্ঠার এন্ট্রিতে সেই পৃষ্ঠাটির মধ্যে সমস্ত অফসেটের অ্যারে রয়েছে।

  3. তারপরে বিটম্যাপ হিপ স্ক্যান বিটম্যাপের মাধ্যমে পঠিত পৃষ্ঠা নম্বর এবং অফসেটের সাথে সম্পর্কিত হ্যাপের ডেটা পেতে পাঠ করে। তারপরে এটি দৃশ্যমানতা, যোগ্যতা ইত্যাদি পরীক্ষা করে এবং এই সমস্ত পরীক্ষার ফলাফলের উপর ভিত্তি করে টুপল দেয়।

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