我有一个名为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
结果:
答案 0 :(得分:0)
您的执行计划是完美的,汇总和GROUP BY
仅需0.15秒。
位图索引扫描是正确的选择,IS NOT NULL
条件的选择性不足以建立索引。
预计必须从表中获取很多行的位图堆扫描将花费最多的时间。
如果索引WHERE
子句和SELECT
列表中的所有列都在索引中并且表被全新清理,则仅使用索引扫描可能会更便宜。