【问题标题】:Is there any way to optimize next query?有没有办法优化下一个查询?
【发布时间】:2021-10-27 07:38:52
【问题描述】:

我需要计算表格的统计数据。我写了下一条SQL:

     SELECT
          DISTINCT ("region"),
          COUNT(*) as total,
          COUNT(*) FILTER(WHERE t1.insert_status = 'success' AND t1.insert_status = 'success') as completed,
          COUNT(*) FILTER(WHERE t1.insert_status IS NULL AND t1.insert_status IS NULL ) as waiting,
          COUNT(*) FILTER(WHERE t1.insert_status = 'failed' ) as insert_failed
          FROM xml_files t1

        WHERE t1.section_name='payments'
        AND processed_date >='2010-07-28' AND processed_date <='2021-08-28'
        
        group by region

我的表太大(5000 万行)并且需要太多时间才能得到结果的问题。有没有办法优化这个查询?

有哪些可能的优化方式?

【问题讨论】:

  • 您的查询缺少WHERE 子句。并且t1 没有定义。
  • 与您的问题无关,但是:distinct 不是函数。它始终适用于选择列表中的所有列。用括号括住其中一列不会改变任何东西并且是无用的。 distinct (a),bdistinct a,(b)distinct a,b 相同 - 与 group by 结合使用更没有意义

标签: sql postgresql query-optimization


【解决方案1】:

首先,您几乎不需要 select distinctgroup by。其次,您的查询有语法错误。

假设您打算:

SELECT region,
       COUNT(*) as total,
       COUNT(*) FILTER (WHERE t1.insert_status = 'success' AND t1.insert_status = 'success') as completed,
       COUNT(*) FILTER (WHERE t1.insert_status IS NULL AND t1.insert_status IS NULL ) as waiting,
       COUNT(*) FILTER (WHERE t1.insert_status = 'failed' ) as insert_failed
FROM xml_files t1
WHERE t1.section_name = 'payments' AND
      t1.processed_date >='2010-07-28' AND t1.processed_date <='2021-08-28'        
GROUP BY region;

那么你想要一个xml_files(second_name, processed_date, region, insert_status) 的索引。

【讨论】:

  • 复合索引是否会显着提高性能?
  • @GordonLinoff t1.insert_status = 'success' AND t1.insert_status = 'success' 有什么意义吗?下一行也一样。您能否举一个示例(或链接),其中distinctgroup by 在同一列上都需要?
  • @Steeeve 。 . .我没有写查询。我试图尽可能合理地修复它。您应该向 OP 提出问题。
  • @DmitryBubnenkov 。 . .复合索引可能是一个巨大的胜利,特别是如果数据库能够进行仅索引扫描。
  • @GordonLinoff 非常感谢。我测试了综合指数,速度提高了 2 倍。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 2018-08-15
  • 2013-01-01
相关资源
最近更新 更多