【问题标题】:slow query in postgres using group by使用 group by 在 postgres 中进行慢速查询
【发布时间】:2019-01-06 07:53:03
【问题描述】:

我有一个名为 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-tree 索引的,impressions 不是(不必要的)。

似乎 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

结果:

【问题讨论】:

  • 您是否尝试在banner_name 上添加索引?
  • 已编入索引。创建索引 index_facebook_adset_insights_on_banner_name ON facebook_adset_insights(banner_name text_ops);
  • @barbenezra 你在截图中使用的是什么程序?
  • @barbenezra 你是怎么得到那个截图的?
  • @Aijaz 我使用过:1. EXPLAIN (FORMAT JSON) {YOUR SELECT QUERY} 在任何 SQL 客户端(Postico)中 2. 获取输出并粘贴到 tatiyants.com/pev/#/plans/new

标签: sql database postgresql optimization indexing


【解决方案1】:

你的执行计划很完美,聚合和GROUP BY只需要0.15秒。

位图索引扫描是对的,IS NOT NULL的条件选择性不够,不能被索引。

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

如果WHERE 子句和SELECT 列表中的所有列都在索引中并且表是新清理的,那么您可能只扫描索引会更便宜。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-30
    • 2021-12-03
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多