এখানে একটি বহুবিধ সূচকের দ্বিতীয় কলামে একটি সারণী জিজ্ঞাসা করার ফলাফল রয়েছে ।
এর প্রভাবগুলি কারওর জন্য পুনরুত্পাদন করা সহজ। বাড়িতে এটি চেষ্টা করুন।
আমি 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
সূচি স্ক্যানগুলি অক্ষম করার পরে, ক্যোয়ারী পরিকল্পনাকারী একটি বিটম্যাপ হ্যাপ স্ক্যান বেছে নেয়, যা প্রায় তত দ্রুত কাজ করে। এটি নিষ্ক্রিয় করার পরে কেবল তা সিক্যুয়াল স্ক্যানে ফিরে আসে।