[英]How to improve query performance with OR or IN operators in PostgreSQL?
[英]Improve PostgreSQL query performance
在我的服务器上运行此查询时,速度很慢,我不明白为什么。 谁能帮我弄清楚?
询问:
SELECT
"t_dat"."t_year" AS "c0",
"t_dat"."t_month" AS "c1",
"t_dat"."t_week" AS "c2",
"t_dat"."t_day" AS "c3",
"t_purs"."p_id" AS "c4",
sum("t_purs"."days") AS "m0",
sum("t_purs"."timecreated") AS "m1"
FROM "t_dat", "t_purs"
WHERE "t_purs"."created" = "t_dat"."t_key"
AND "t_dat"."t_year" = 2013
AND "t_dat"."t_month" = 3
AND "t_dat"."t_week" = 9
AND "t_dat"."t_day" IN (1,2)
AND "t_purs"."p_id" IN (
'4','15','18','19','20','29',
'31','35','46','56','72','78')
GROUP BY
"t_dat"."t_year",
"t_dat"."t_month",
"t_dat"."t_week",
"t_dat"."t_day",
"t_purs"."p_id"
很难说你到底错过了什么,但如果我是你,我会确保跟踪索引存在:
CREATE INDEX t_dat_id_date_idx
ON t_dat (t_key, t_year, t_month, t_week, t_day);
对于t_purs
,创建此索引:
CREATE INDEX t_purs_created_p_id_idx
ON t_purs (created, p_id);
考虑在表中使用单个列 :
t_date date
而不是(t_year, t_month, t_week, t_day)
。 数据类型date
占用4个字节。 这会缩小你的表,使索引更小更快,分组更容易。
可以使用extract()
从日期中轻松快速地提取年 , 月 , 周和日 。 您的查询可能看起来像这样,会更快:
SELECT extract (year FROM t_date) AS c0
,extract (month FROM t_date) AS c1
,extract (week FROM t_date) AS c2
,extract (day FROM t_date) AS c3
,p.p_id AS c4
,sum(p.days) AS m0
,sum(p.timecreated) AS m1
FROM t_dat d
JOIN t_purs p ON p.created = d.t_key
WHERE d.t_date IN ('2013-03-01'::date, '2013-03-02'::date)
AND p.p_id IN (4,15,18,19,20,29,31,35,46,56,72,78)
GROUP BY d.t_date, p.p_id;
对性能更重要的是索引,它只是:
CREATE INDEX t_dat_date_idx ON t_dat (t_key, t_date);
或者,根据数据分布:
CREATE INDEX t_dat_date_idx ON t_dat (t_date, t_key);
列的顺序很重要。 你甚至可以创造两者。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.