পোস্টগ্রেএসকিউএল সূচকগুলির কাজ


73

পোস্টগ্রেএসকিউএল ইনডেক্সের কাজ সম্পর্কিত আমার বেশ কয়েকটি প্রশ্ন রয়েছে। Friendsনিম্নলিখিত সূচী সহ আমার একটি টেবিল রয়েছে:

   Friends ( user_id1 ,user_id2) 

user_id1এবং টেবিলে user_id2বিদেশী কীগুলি areuser

  1. এগুলি কি সমতুল্য? তা না হলে কেন?

    Index(user_id1,user_id2) and Index(user_id2,user_id1)
  2. যদি আমি প্রাইমারী কী (ইউজার_আইডি 1, ইউজার_আইডি 2) তৈরি করি তবে এটি কি স্বয়ংক্রিয়ভাবে এর জন্য সূচি তৈরি করে এবং

    যদি প্রথম প্রশ্নের সূচকগুলি সমতুল্য না হয়, তবে উপরের প্রাথমিক কী কমান্ডের উপর কোন সূচকটি তৈরি করা হয়?

উত্তর:


77

এখানে একটি বহুবিধ সূচকের দ্বিতীয় কলামে একটি সারণী জিজ্ঞাসা করার ফলাফল রয়েছে ।
এর প্রভাবগুলি কারওর জন্য পুনরুত্পাদন করা সহজ। বাড়িতে এটি চেষ্টা করুন।

আমি 23322 সারি সহ একটি বাস্তব জীবনের ডাটাবেসের মাঝারি আকারের টেবিলটি ব্যবহার করে দেবিয়ানে পোস্টগ্রিজ এসকিউএল 9.0.5 দিয়ে পরীক্ষা করেছি । এটি টেবিলগুলির adr(ঠিকানা) এবং att(বৈশিষ্ট্য) মধ্যে n: মি সম্পর্ক প্রয়োগ করে , তবে এটি এখানে প্রাসঙ্গিক নয়। সরলীকৃত স্কিমা:

CREATE TABLE adratt (
  adratt_id serial PRIMARY KEY
, adr_id    integer NOT NULL
, att_id    integer NOT NULL
, log_up    timestamp(0) NOT NULL DEFAULT (now())::timestamp(0)
, CONSTRAINT adratt_uni UNIQUE (adr_id, att_id)
);

UNIQUEবাধ্যতা কার্যকরভাবে একটি অনন্য সূচক প্রয়োগ করা হয়। আমি নিশ্চিত হতে প্লেইন ইনডেক্স দিয়ে পরীক্ষার পুনরাবৃত্তি করেছি এবং প্রত্যাশার মতো অভিন্ন ফলাফল পেয়েছি।

CREATE INDEX adratt_idx ON adratt(adr_id, att_id)

টেবিলটি adratt_uniসূচকে গুচ্ছযুক্ত এবং পরীক্ষার আগে আমি দৌড়েছি:

CLUSTER adratt;
ANALYZE adratt;

উপর কোয়েরিগুলির ক্রমিক স্ক্যানগুলি (adr_id, att_id)তত দ্রুততর হয় যতটা সম্ভব। মাল্টিকালম ইনডেক্সটি কেবলমাত্র দ্বিতীয় সূচক কলামে কোয়েরির শর্তের জন্য ব্যবহৃত হবে।

আমি ক্যাশেটি জনপ্রিয় করার জন্য কয়েকবার অনুসন্ধান চালিয়েছি এবং তুলনামূলক ফলাফল পেতে দশ রানের মধ্যে সেরাটি বেছে নিয়েছি।

1. উভয় কলাম ব্যবহার করে জিজ্ঞাসা করুন

SELECT *
FROM   adratt
WHERE  att_id = 90
AND    adr_id = 10;

 adratt_id | adr_id | att_id |       log_up
-----------+--------+--------+---------------------
       123 |     10 |     90 | 2008-07-29 09:35:54
(1 row)

এর আউটপুট EXPLAIN ANALYZE:

Index Scan using adratt_uni on adratt  (cost=0.00..3.48 rows=1 width=20) (actual time=0.022..0.025 rows=1 loops=1)
  Index Cond: ((adr_id = 10) AND (att_id = 90))
Total runtime: 0.067 ms

২. প্রথম কলাম ব্যবহার করে জিজ্ঞাসা করুন

SELECT * FROM adratt WHERE adr_id = 10

 adratt_id | adr_id | att_id |       log_up
-----------+--------+--------+---------------------
       126 |     10 |     10 | 2008-07-29 09:35:54
       125 |     10 |     13 | 2008-07-29 09:35:54
      4711 |     10 |     21 | 2008-07-29 09:35:54
     29322 |     10 |     22 | 2011-06-06 15:50:38
     29321 |     10 |     30 | 2011-06-06 15:47:17
       124 |     10 |     62 | 2008-07-29 09:35:54
     21913 |     10 |     78 | 2008-07-29 09:35:54
       123 |     10 |     90 | 2008-07-29 09:35:54
     28352 |     10 |    106 | 2010-11-22 12:37:50
(9 rows)

এর আউটপুট EXPLAIN ANALYZE:

Index Scan using adratt_uni on adratt  (cost=0.00..8.23 rows=9 width=20) (actual time=0.007..0.023 rows=9 loops=1)
  Index Cond: (adr_id = 10)
Total runtime: 0.058 ms

৩. দ্বিতীয় কলামটি ব্যবহার করে জিজ্ঞাসা করুন

SELECT * FROM adratt WHERE att_id = 90

 adratt_id | adr_id | att_id |       log_up
-----------+--------+--------+---------------------
       123 |     10 |     90 | 2008-07-29 09:35:54
       180 |     39 |     90 | 2008-08-29 15:46:07
...
(83 rows)

এর আউটপুট EXPLAIN ANALYZE:

Index Scan using adratt_uni on adratt  (cost=0.00..818.51 rows=83 width=20) (actual time=0.014..0.694 rows=83 loops=1)
  Index Cond: (att_id = 90)
Total runtime: 0.849 ms

4. ইনডেক্সস্ক্যান এবং বিটম্যাপস্ক্যান অক্ষম করুন

SET enable_indexscan = off;
SELECT * FROM adratt WHERE att_id = 90

ব্যাখ্যা বিশ্লেষণের আউটপুট:

Bitmap Heap Scan on adratt  (cost=779.94..854.74 rows=83 width=20) (actual time=0.558..0.743 rows=83 loops=1)
  Recheck Cond: (att_id = 90)
  ->  Bitmap Index Scan on adratt_uni  (cost=0.00..779.86 rows=83 width=0) (actual time=0.544..0.544 rows=83 loops=1)
        Index Cond: (att_id = 90)
Total runtime: 0.894 ms
SET enable_bitmapscan = off
SELECT * FROM adratt WHERE att_id = 90

এর আউটপুট EXPLAIN ANALYZE:

Seq Scan on adratt  (cost=0.00..1323.10 rows=83 width=20) (actual time=0.009..2.429 rows=83 loops=1)
  Filter: (att_id = 90)
Total runtime: 2.680 ms

উপসংহার

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


সূচকে ম্যাচের সংখ্যা যথেষ্ট পরিমাণে হলে ক্লাস্টারিং একটি পার্থক্য আনবে ( প্রমাণের জন্য এখানে দেখুন - ডেটা ক্যাশে করার জন্য ডাবল রান নোট করুন)
জ্যাক ডগলাস

1
@ জ্যাকডুগলাস: আমি এটি আরও কিছু চিন্তাভাবনা করেছি। ক্লাস্টারিং সাধারণত সাহায্য করতে পারে, কারণ এটি কার্যকরভাবে কার্যকর হয় a vacuum fullএবং a reindex। চেয়ে এটি প্রথম বা উভয় নেতৃস্থানীয় কলাম উপর সূচক স্ক্যান সাহায্য করবে অন্য অনেক , কিন্তু আঘাত দ্বিতীয় কলামে উপর প্রশ্নের। একটি তাজা ক্লাস্টার্ড টেবিলের মধ্যে, দ্বিতীয় কলামে একই মান সহ সারিগুলি ছড়িয়ে দেওয়া হয়েছে, যাতে সর্বাধিক ব্লকগুলি পড়তে হবে।
এরউইন ব্র্যান্ডসটেটার

28

পুনরায় 1) হ্যাঁ এবং না।

উভয় কলাম ব্যবহার করে এমন প্রশ্নের জন্য যেমন where (user_id1, user_id2) = (1,2)কোন সূচকটি তৈরি হয়েছে তা বিবেচ্য নয়।

এমন একটি প্রশ্নের জন্য যেটির কেবল একটি কলামে শর্ত রয়েছে যেমন where user_id1 = 1এটি বিবেচনা করে কারণ সাধারণত কেবলমাত্র "শীর্ষস্থানীয়" কলামগুলি অপ্টিমাইজারের সাথে তুলনা করার জন্য ব্যবহার করা যেতে পারে। সুতরাং where user_id1 = 1সূচক (ব্যবহারকারীর_আইডি 1, ব্যবহারকারীর_আইডি 2) ব্যবহার করতে সক্ষম হবে তবে এটি সমস্ত ক্ষেত্রে কোনও সূচক (ব্যবহারকারী_আইডি 2, ব্যবহারকারী_আইডি 1) করতে সক্ষম হবে না।

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

ওরাকল 11 যা সূচী সংজ্ঞাটির শুরুতে নয় এমন কলামগুলি (কখনও কখনও) ব্যবহার করতে পারে।

পুনরায় 2) হ্যাঁ এটি একটি সূচক তৈরি করবে

ম্যানুয়াল থেকে উদ্ধৃতি

প্রাথমিক কী যুক্ত করা স্বয়ংক্রিয়ভাবে প্রাথমিক কীতে ব্যবহৃত কলাম বা কলামগুলির গোষ্ঠীতে একটি অনন্য বিটি সূচক তৈরি করবে।

রি 2 এ) Primary Key (user_id1,user_id2)(ইউজার_আইডি 1, ইউজার_আইডি 2) এ একটি সূচি তৈরি করবে (যা আপনি খুব সহজেই এ জাতীয় প্রাথমিক কী তৈরি করে নিজেই আবিষ্কার করতে পারেন )

আমি আপনাকে সুপারিশ করছি যে আপনি ম্যানুয়ালটিতে সূচীগুলি সম্পর্কে অধ্যায়টি পড়ুন , এটি মূলত উপরের সমস্ত প্রশ্নের উত্তর দেয়।

অতিরিক্তভাবে, কি সূচক তৈরি করতে হবে? দ্বারা Depesz সূচক কলাম এবং অন্যান্য সূচক সম্পর্কিত বিষয়গুলিতে অর্ডার ব্যাখ্যা করার জন্য একটি ভাল কাজ করে।


11

বিজ্ঞাপন 1)
পোস্টগ্র্রেএসকিউএলে সীমাবদ্ধতা রয়েছে যেমন @a_horse_with_no_name বর্ণনা করেসংস্করণ 8.0 অবধি মাল্টিকোলোম সূচকগুলি কেবল শীর্ষস্থানীয় কলাম (গুলি)-এ প্রশ্নের জন্য ব্যবহার করা যেতে পারে। এটি 8.1 সংস্করণে উন্নত করা হয়েছে। Postgres 10 এর জন্য বর্তমান ম্যানুয়াল (আপডেট করা হয়েছে) ব্যাখ্যা করে:

মাল্টিকোলামন বি-ট্রি সূচকটি ক্যোয়ারী শর্তগুলির সাথে ব্যবহার করা যেতে পারে যা সূচকের কলামগুলির যে কোনও উপসেট জড়িত, তবে শীর্ষস্থানীয় (বামতম) কলামগুলিতে বাধা থাকলে সূচকটি সবচেয়ে কার্যকর is সঠিক নিয়মটি হ'ল নেতৃস্থানীয় কলামগুলিতে সাম্যের সীমাবদ্ধতা, এবং প্রথম কলামে যে কোনও অসমতার সীমাবদ্ধতাগুলির মধ্যে কোনও সমতার সীমাবদ্ধতা নেই তা স্ক্যান করা সূচকের অংশ সীমাবদ্ধ করতে ব্যবহৃত হবে। এই কলামগুলির ডানদিকে কলামগুলিতে সীমাবদ্ধতাগুলি সূচীতে পরীক্ষা করা হয়, সুতরাং তারা টেবিলে যথাযথ পরিদর্শনগুলি সংরক্ষণ করে তবে স্ক্যান করতে হবে এমন সূচকের অংশটি তারা কমায় না। উদাহরণস্বরূপ, একটি সূচি (a, b, c)এবং একটি ক্যোরিয় শর্তের ভিত্তিতে WHERE a = 5 AND b >= 42 AND c < 77, সূচকটি প্রথম এন্ট্রি থেকে a= 5 এবং দিয়ে স্ক্যান করতে হবেb= ৪ দিয়ে শেষ এন্ট্রিটি দিয়ে a42২ টি পর্যন্ত c5..৩>> = with 77 সহ সূচক এন্ট্রিগুলি এড়ানো হবে তবে তাদের এখনও স্ক্যান করতে হবে। এই সূচকটি নীতিগতভাবে এমন প্রশ্নের জন্য ব্যবহার করা যেতে পারে যার সীমাবদ্ধতা রয়েছে bএবং / বা cকোনও বাধা নেই a- তবে পুরো সূচিটি স্ক্যান করতে হবে, তাই বেশিরভাগ ক্ষেত্রে পরিকল্পনাকারী সূচকটি ব্যবহারের চেয়ে ক্রমিক টেবিল স্ক্যানটিকে পছন্দ করবে prefer

জোর আমার। আমি অভিজ্ঞতা থেকে তা নিশ্চিত করতে পারি।
এছাড়াও পরীক্ষার কেসটি আমার উত্তরগুলি এখানে যুক্ত করেছে


11

এটি জ্যাকের উত্তরের জবাব , একটি মন্তব্য তা করবে না।

সংস্করণ 9.2 এর পূর্বে পোস্টগ্রেএসকিউএলে কোনও প্রচ্ছদ সূচক ছিল না । এমভিসিসি মডেলের কারণে, ফলাফল সেটটিতে প্রতিটি টিপলটি দৃশ্যমানতা পরীক্ষা করতে দেখতে যেতে হবে। আপনি হয়ত ওরাকল নিয়ে ভাবছেন।

পোস্টগ্রিএসকিউএল বিকাশকারীরা "কেবলমাত্র ইনডেক্সের স্ক্যানগুলি" সম্পর্কে কথা বলেন । আসলে, ফিচারটি পোস্টগ্রিস 9.2 এর সাথে প্রকাশ করা হয়েছে। প্রতিশ্রুতি বার্তা পড়ুন
Depesz একটি খুব তথ্যমূলক ব্লগ পোস্ট লিখেছেন ।

সত্য কভারিং সূচকগুলি (আপডেট) INCLUDEপোস্টগ্রিস ১১ সহ ক্লজ সহ প্রবর্তিত হয় । সম্পর্কিত:

এটিও কিছুটা বন্ধ is

এটি এই সত্যের উপর নির্ভর করে যে সারণীতে অতিরিক্ত কলামগুলির সূচীতে প্রদর্শিত না হওয়ার কারণে সূচকের একটি 'পূর্ণ স্ক্যান' প্রায়শই সূচকযুক্ত টেবিলের 'পূর্ণ স্ক্যান' এর চেয়ে দ্রুত হয়।

আমার অন্য উত্তরের মন্তব্যে যেমন রিপোর্ট করা হয়েছে আমি দুটি পূর্ণসংখ্যার একটি টেবিল এবং অন্য কিছুই দিয়ে টেস্টও চালিয়েছি। সূচকটি টেবিলের মতো একই কলামগুলিকে ধারণ করে। বিট্রি সূচকের আকার টেবিলের চেয়ে 2/3 এর কাছাকাছি। ফ্যাক্টর ৩. এর দ্রুতগতি ব্যাখ্যা করার জন্য যথেষ্ট নয় আমি আপনার সেটআপের উপর ভিত্তি করে দুটি কলামে সরলীকৃত এবং 100000 সারি সহ আরও পরীক্ষা চালিয়েছি। আমার পোস্টগ্রিএসকিউএল 9.0 ইনস্টলেশনতে ফলাফলগুলি সামঞ্জস্যপূর্ণ ছিল।

যদি টেবিলটিতে অতিরিক্ত কলাম থাকে তবে সূচকের সাথে গতিসম্পন্ন আরও বেশি হয়ে ওঠে, তবে এটি এখানে কেবলমাত্র ফ্যাক্টর নয়

প্রধান পয়েন্টগুলি সংক্ষেপে:

  • অ-নেতৃস্থানীয় কলামগুলিতে প্রশ্নের সাথে একাধিক-কলাম সূচকগুলি ব্যবহার করা যেতে পারে, তবে স্পিডআপটি কেবল নির্বাচনী মানদণ্ডের জন্য ফ্যাক্টর 3 এর প্রায় কাছাকাছি (ফলাফলের সারিগুলির ছোট শতাংশ)। বৃহত্তর টিপলসের জন্য উচ্চতর, ফলাফল সেটে টেবিলের বৃহত্তর অংশের জন্য কম।

  • কর্মক্ষমতা গুরুত্বপূর্ণ হলে এই কলামগুলিতে একটি অতিরিক্ত সূচক তৈরি করুন।

  • যদি সমস্ত জড়িত কলামগুলি একটি সূচীতে অন্তর্ভুক্ত থাকে (কভারিং সূচক) এবং সমস্ত জড়িত সারি (প্রতি ব্লক) সমস্ত লেনদেনের জন্য দৃশ্যমান হয়, আপনি পিজে 9.2 বা তার পরে "ইনডেক্স কেবলমাত্র স্ক্যান" পেতে পারেন ।


7
  1. এগুলি কি সমতুল্য? তা না হলে কেন?

    সূচক (ব্যবহারকারী_আইডি 1, ব্যবহারকারী_আইডি 2) এবং সূচি (ব্যবহারকারী_আইডি 2, ব্যবহারকারী_আইডি 1)

এগুলি সমতুল্য নয় এবং সাধারণত বলার সূচক (বার, বাজ) ফর্মের অনুসন্ধানের জন্য দক্ষ হবে না select * from foo where baz=?

এরউইন দেখিয়েছেন যে এই জাতীয় সূচীগুলি সত্যই কোনও প্রশ্নের গতি বাড়িয়ে তুলতে পারে তবে এই প্রভাবটি সীমাবদ্ধ এবং আপনি সাধারণত কোনও সূচককে একটি চেহারা উন্নত করার প্রত্যাশা করেন না - এটি নির্ভর করে যে কোনও সূচকের 'সম্পূর্ণ স্ক্যান' প্রায়শই হয় সূচীতে উপস্থিত না হওয়া সারণীতে অতিরিক্ত কলামগুলির কারণে সূচকযুক্ত টেবিলের 'পূর্ণ স্ক্যান' এর চেয়ে দ্রুত

সংক্ষিপ্তসার: সূচিগুলি অ-নেতৃস্থানীয় কলামগুলিতেও ক্যোরিগুলিকে সহায়তা করতে পারে, তবে দুটি মাধ্যমিক এবং অপেক্ষাকৃত ছোট্ট একটির মধ্যে এবং নাটকীয় উপায়ে নয় আপনি সাধারণত বিটিরি কাঠামোর কারণে কোনও সূচককে সহায়তা করার প্রত্যাশা করেন

সূচকের সম্পূর্ণ স্ক্যানটি টেবিলের সম্পূর্ণ স্ক্যানের তুলনায় উল্লেখযোগ্যভাবে সস্তা এবং দুটি হয়: এনবি সূচকগুলি যে দুটি উপায়ে সহায়তা করতে পারে তা হ'ল: টেবিলের লুকগুলি সস্তা (কারণ তাদের কয়েকটি রয়েছে বা তারা গুচ্ছযুক্ত), বা ২. সূচকটি আচ্ছাদন করা হয়েছে যাতে সমস্ত উফগুলিতে কোনও টেবিল লুকআপ নেই , এখানে ইরভিনস মন্তব্য দেখুন

টেস্টবেড:

create table foo(bar integer not null, baz integer not null, qux text not null);

insert into foo(bar, baz, qux)
select random()*100, random()*100, 'some random text '||g from generate_series(1,10000) g;

ক্যোয়ারী 1 (কোনও সূচি নেই, 74 টি বাফার মারছে ):

explain (buffers, analyze, verbose) select max(qux) from foo where baz=0;
                                                  QUERY PLAN
--------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=181.41..181.42 rows=1 width=32) (actual time=3.301..3.302 rows=1 loops=1)
   Output: max(qux)
   Buffers: shared hit=74
   ->  Seq Scan on stack.foo  (cost=0.00..181.30 rows=43 width=32) (actual time=0.043..3.228 rows=52 loops=1)
         Output: bar, baz, qux
         Filter: (foo.baz = 0)
         Buffers: shared hit=74
 Total runtime: 3.335 ms

ক্যোয়ারী 2 (সূচক সহ - অপ্টিমাইজার সূচকটিকে উপেক্ষা করে - আবার buff৪ টি বাফার মারছে ):

create index bar_baz on foo(bar, baz);

explain (buffers, analyze, verbose) select max(qux) from foo where baz=0;
                                                  QUERY PLAN
--------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=199.12..199.13 rows=1 width=32) (actual time=3.277..3.277 rows=1 loops=1)
   Output: max(qux)
   Buffers: shared hit=74
   ->  Seq Scan on stack.foo  (cost=0.00..199.00 rows=50 width=32) (actual time=0.043..3.210 rows=52 loops=1)
         Output: bar, baz, qux
         Filter: (foo.baz = 0)
         Buffers: shared hit=74
 Total runtime: 3.311 ms

ক্যোয়ারী 2 (সূচী সহ - এবং আমরা এটির ব্যবহারের জন্য অপ্টিমাইজারটিকে চালিত করি):

explain (buffers, analyze, verbose) select max(qux) from foo where bar>-1000 and baz=0;
                                                       QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=115.56..115.57 rows=1 width=32) (actual time=1.495..1.495 rows=1 loops=1)
   Output: max(qux)
   Buffers: shared hit=36 read=30
   ->  Bitmap Heap Scan on stack.foo  (cost=73.59..115.52 rows=17 width=32) (actual time=1.370..1.428 rows=52 loops=1)
         Output: bar, baz, qux
         Recheck Cond: ((foo.bar > (-1000)) AND (foo.baz = 0))
         Buffers: shared hit=36 read=30
         ->  Bitmap Index Scan on bar_baz  (cost=0.00..73.58 rows=17 width=0) (actual time=1.356..1.356 rows=52 loops=1)
               Index Cond: ((foo.bar > (-1000)) AND (foo.baz = 0))
               Buffers: shared read=30
 Total runtime: 1.535 ms

সুতরাং 30 বাফারগুলিতে এই ক্ষেত্রে সূচকের মাধ্যমে অ্যাক্সেস দ্বিগুণ দ্রুততর হয় - যা সূচকের দিক থেকে 'সামান্য দ্রুত' !, এবং ফিল্টারযুক্ত সারি এবং গুচ্ছ বৈশিষ্ট্যের সংখ্যার সাথে টেবিল এবং সূচকের আপেক্ষিক আকারের উপর নির্ভর করে ওয়াইএমএমভি টেবিলের তথ্য

বিপরীতে, নেতৃস্থানীয় কলামের প্রশ্নগুলি সূচকের বিট্রি কাঠামোটি ব্যবহার করে - এই ক্ষেত্রে 2 টি বাফার মারছে :

explain (buffers, analyze, verbose) select max(qux) from foo where bar=0;
                                                       QUERY PLAN
------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=75.70..75.71 rows=1 width=32) (actual time=0.172..0.173 rows=1 loops=1)
   Output: max(qux)
   Buffers: shared hit=38
   ->  Bitmap Heap Scan on stack.foo  (cost=4.64..75.57 rows=50 width=32) (actual time=0.036..0.097 rows=59 loops=1)
         Output: bar, baz, qux
         Recheck Cond: (foo.bar = 0)
         Buffers: shared hit=38
         ->  Bitmap Index Scan on bar_baz  (cost=0.00..4.63 rows=50 width=0) (actual time=0.024..0.024 rows=59 loops=1)
               Index Cond: (foo.bar = 0)
               Buffers: shared hit=2
 Total runtime: 0.209 ms
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.