使用group by

时间:2018-07-30 05:42:19

标签: sql database postgresql optimization indexing

我有一个名为facebook_adset_insights的表,其中包含近550万行,看起来像:

CREATE TABLE facebook_adset_insights (
id SERIAL PRIMARY KEY,
start_time timestamp without time zone,
impressions integer,
banner_name character varying
......);

banner_name可能为NULL(大约100k的banner_name为NULL),而印象数可能为NULL(大约80k的印象为NULL) banner_name是b树索引的,而展示次数不是(不必要的)。

似乎GROUP BY和SUM减慢了查询的速度,所以我试图解释分析,但是不确定运行以下查询计划有什么问题:

EXPLAIN (ANALYZE, COSTS, VERBOSE, BUFFERS, FORMAT JSON)
SELECT banner_name, sum(impressions)
FROM facebook_adset_insights
WHERE impressions IS NOT NULL AND banner_name IS NOT NULL AND start_time > '2018-02-01'
GROUP BY banner_name

结果:

enter image description here

1 个答案:

答案 0 :(得分:0)

您的执行计划是完美的,汇总和GROUP BY仅需0.15秒。

位图索引扫描是正确的选择,IS NOT NULL条件的选择性不足以建立索引。

预计必须从表中获取很多行的位图堆扫描将花费最多的时间。

如果索引WHERE子句和SELECT列表中的所有列都在索引中并且表被全新清理,则仅使用索引扫描可能会更便宜。