কেন পোস্টগ্রেএসকিউএল সূচীবদ্ধ কলামে ক্রমিক স্ক্যান সম্পাদন করে?


150

খুব সাধারণ উদাহরণ - একটি টেবিল, একটি সূচক, একটি ক্যোয়ারী:

CREATE TABLE book
(
  id bigserial NOT NULL,
  "year" integer,
  -- other columns...
);

CREATE INDEX book_year_idx ON book (year)

EXPLAIN
 SELECT *
   FROM book b
  WHERE b.year > 2009

আমাকে দেয়:

Seq Scan on book b  (cost=0.00..25663.80 rows=105425 width=622)
  Filter: (year > 2009)

কেন এটি পরিবর্তে সূচক স্ক্যান সম্পাদন করে না? আমি কী মিস করছি?

উত্তর:


222

যদি সারণিটি সারণির সমস্ত সারিগুলির প্রায় 5-10% এরও বেশি ফেরত দেয় তবে একটি ক্রমিক স্ক্যান সূচক স্ক্যানের চেয়ে অনেক দ্রুত।

এর কারণ এটি একটি ইনডেক্স স্ক্যানের প্রতিটি সারির জন্য বেশ কয়েকটি আইও ক্রিয়াকলাপ প্রয়োজন (সূচীতে সারিটি সন্ধান করুন, তারপরে rowੇਰ থেকে সারিটি পুনরুদ্ধার করুন)। যেখানে ক্রমিক স্ক্যানের জন্য প্রতিটি সারির জন্য কেবল একটি একক আইও প্রয়োজন - বা তার চেয়েও কম কারণ ডিস্কে থাকা একটি ব্লক (পৃষ্ঠায়) একাধিক সারি থাকে, সুতরাং একক আইও ক্রিয়াকলাপের সাথে একাধিক সারি আরও আনা যায়।

বিটিডব্লিউ: এটি অন্যান্য ডিবিএমএসের ক্ষেত্রেও সত্য - "কেবলমাত্র সূচক কেবল স্ক্যান" হিসাবে কিছু অপ্টিমাইজেশানকে আলাদা করে নেওয়া হয়েছে (তবে একটি নির্বাচন করুন * এর পক্ষে এই জাতীয় ডিবিএমএস কোনও "ইনডেক্স কেবলমাত্র স্ক্যান" করতে পারে না)


12
5-10% বেশ কয়েকটি কনফিগারেশন সেটিংস এবং পাশাপাশি ডেটা সঞ্চয় করার উপর নির্ভর করে। এটি কোনও কঠিন সংখ্যা নয়।
ফ্রাঙ্ক হিকেন্স 13

6
@ ফ্র্যাঙ্ক: এ কারণেই আমি "আনুমানিক" বলেছি :) তবে এটিকে নির্দেশ করার জন্য ধন্যবাদ
এ_ ঘোড়া_বিহীন_নাম_নাম ১৩

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

4
মজার প্রশ্নটি হল যে ডাটাবেসটি কীভাবে জানতে পারে যে কোয়েরিটি প্রথম না করে কত সারিটি ফিরে আসবে? এটি কোথাও টেবিলের আকার বনাম বিভিন্ন মানের সংখ্যা হিসাবে স্ট্যাটাস সংরক্ষণ করে?
লরেন্ট গ্রাওগোর

7
@ লরেন্টগ্রোওয়ের: হ্যাঁ, ডাটাবেস সারি সংখ্যা এবং মান বিতরণ সম্পর্কে পরিসংখ্যান সঞ্চয় করে।
বিশদটির

13

আপনি কি টেবিল / ডাটাবেস বিশ্লেষণ করেছেন? এবং পরিসংখ্যান সম্পর্কে কি ? যেখানে অনেকগুলি রেকর্ড রয়েছে যেখানে বছর> ২০০৯, একটি ক্রমিক স্ক্যান সূচক স্ক্যানের চেয়ে দ্রুত হতে পারে।


0

ইনডেক্স স্ক্যানে, পড়ুন মাথাটি এক সারি থেকে অন্য সারিতে চলে যায় যা পরবর্তী শারীরিক ব্লক (অনুক্রমিক স্ক্যানে) পড়ার চেয়ে 1000 গুণ ধীর হয়।

সুতরাং, যদি (রেকর্ডের সংখ্যা * 1000 পুনরুদ্ধার করা) মোট রেকর্ডের তুলনায় কম হয় তবে সূচক স্ক্যান আরও ভাল সম্পাদন করবে।


0

@ a_horse_with_no_name এটিকে বেশ ভালভাবে ব্যাখ্যা করেছে। এছাড়াও যদি আপনি সত্যিই একটি সূচক স্ক্যান ব্যবহার করতে চান তবে আপনার সাধারণত যেখানে ক্লজটিতে সীমাবদ্ধ রেঞ্জ ব্যবহার করা উচিত। যেমন - বছর> 2019 এবং বছর <2020।

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

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