আমি একটি WHERE
শর্ত এবং GROUP BY
কোনটি বর্তমানে খুব ধীরগতিতে চলছে তার সাথে এসকিউএল কোয়েরির জন্য কোন সূচকগুলি ব্যবহার করবেন তা নির্ধারণ করার চেষ্টা করছি ।
আমার প্রশ্ন:
SELECT group_id
FROM counter
WHERE ts between timestamp '2014-03-02 00:00:00.0' and timestamp '2014-03-05 12:00:00.0'
GROUP BY group_id
সারণীতে বর্তমানে 32.000.000 সারি রয়েছে। যখন আমি সময়সীমা বাড়িয়েছি তখন ক্যোয়ারির সম্পাদনের সময় অনেক বেড়ে যায়।
প্রশ্নের টেবিলটি দেখতে এমন দেখাচ্ছে:
CREATE TABLE counter (
id bigserial PRIMARY KEY
, ts timestamp NOT NULL
, group_id bigint NOT NULL
);
আমার কাছে বর্তমানে নিম্নলিখিত সূচকগুলি রয়েছে তবে কার্য সম্পাদন এখনও ধীর:
CREATE INDEX ts_index
ON counter
USING btree
(ts);
CREATE INDEX group_id_index
ON counter
USING btree
(group_id);
CREATE INDEX comp_1_index
ON counter
USING btree
(ts, group_id);
CREATE INDEX comp_2_index
ON counter
USING btree
(group_id, ts);
ক্যোয়ারিতে এক্সপ্লেইন চালানো নিম্নলিখিত ফলাফল দেয়:
"QUERY PLAN"
"HashAggregate (cost=467958.16..467958.17 rows=1 width=4)"
" -> Index Scan using ts_index on counter (cost=0.56..467470.93 rows=194892 width=4)"
" Index Cond: ((ts >= '2014-02-26 00:00:00'::timestamp without time zone) AND (ts <= '2014-02-27 23:59:00'::timestamp without time zone))"
উদাহরণস্বরূপ ডেটা সহ এসকিউএল ফিডল: http://sqlfiddle.com/#!15/7492b/1
প্রশ্নটি
আরও ভাল সূচকগুলি যুক্ত করে এই ক্যোয়ারির পারফরম্যান্স উন্নত করা যেতে পারে, বা আমার প্রসেসিং শক্তি বাড়ানো উচিত?
সম্পাদনা 1
PostgreSQL সংস্করণ 9.3.2 ব্যবহৃত হয়।
সম্পাদনা 2
আমি এরউইনের প্রস্তাবটি এর সাথে চেষ্টা করেছিলাম EXISTS
:
SELECT group_id
FROM groups g
WHERE EXISTS (
SELECT 1
FROM counter c
WHERE c.group_id = g.group_id
AND ts BETWEEN timestamp '2014-03-02 00:00:00'
AND timestamp '2014-03-05 12:00:00'
);
তবে দুর্ভাগ্যক্রমে এগুলি পারফরম্যান্স বাড়িয়ে তোলে বলে মনে হয় না। অনুসন্ধান পরিকল্পনা:
"QUERY PLAN"
"Nested Loop Semi Join (cost=1607.18..371680.60 rows=113 width=4)"
" -> Seq Scan on groups g (cost=0.00..2.33 rows=133 width=4)"
" -> Bitmap Heap Scan on counter c (cost=1607.18..158895.53 rows=60641 width=4)"
" Recheck Cond: ((group_id = g.id) AND (ts >= '2014-01-01 00:00:00'::timestamp without time zone) AND (ts <= '2014-03-05 12:00:00'::timestamp without time zone))"
" -> Bitmap Index Scan on comp_2_index (cost=0.00..1592.02 rows=60641 width=0)"
" Index Cond: ((group_id = g.id) AND (ts >= '2014-01-01 00:00:00'::timestamp without time zone) AND (ts <= '2014-03-05 12:00:00'::timestamp without time zone))"
সম্পাদনা 3
ইপারক्यूब থেকে ল্যাটারাল ক্যোয়ারির জন্য ক্যোয়ারী পরিকল্পনা:
"QUERY PLAN"
"Nested Loop (cost=8.98..1200.42 rows=133 width=20)"
" -> Seq Scan on groups g (cost=0.00..2.33 rows=133 width=4)"
" -> Result (cost=8.98..8.99 rows=1 width=0)"
" One-Time Filter: ($1 IS NOT NULL)"
" InitPlan 1 (returns $1)"
" -> Limit (cost=0.56..4.49 rows=1 width=8)"
" -> Index Only Scan using comp_2_index on counter c (cost=0.56..1098691.21 rows=279808 width=8)"
" Index Cond: ((group_id = $0) AND (ts IS NOT NULL) AND (ts >= '2010-03-02 00:00:00'::timestamp without time zone) AND (ts <= '2014-03-05 12:00:00'::timestamp without time zone))"
" InitPlan 2 (returns $2)"
" -> Limit (cost=0.56..4.49 rows=1 width=8)"
" -> Index Only Scan Backward using comp_2_index on counter c_1 (cost=0.56..1098691.21 rows=279808 width=8)"
" Index Cond: ((group_id = $0) AND (ts IS NOT NULL) AND (ts >= '2010-03-02 00:00:00'::timestamp without time zone) AND (ts <= '2014-03-05 12:00:00'::timestamp without time zone))"
group_id
কোনও গণনায় আগ্রহী এবং না?
group_id
টেবিলে কতগুলি বিভিন্ন মান আছে?