【问题标题】:How to make query faster如何让查询更快
【发布时间】:2020-05-06 14:58:57
【问题描述】:

这是我的代码:

SELECT m.id, (SELECT count(r.id) 
              FROM reports as r 
              WHERE r.date BETWEEN NOW()-INTERVAL '7 days' AND NOW() 
                and r.decision = 'ACCEPTED' 
                and r.customer_id in (SELECT c.id 
                                      FROM customers as c 
                                      WHERE c.manager_id = m.id)) as count 
FROM managers as m;

表格是经理、客户和报告。我想为每位经理选择他的所有客户所做的报告数量(使用选定的属性)。这段代码的问题在于它花费了太多时间,并且不知何故找不到更好的方法来构建这个查询。你有什么想法吗?

【问题讨论】:

  • 您是否在谓词列上设置了索引?在您的情况下,它是 r.dater.customer_idc.manager_id
  • 是的,我忘了提,但是我提了。

标签: sql postgresql query-performance


【解决方案1】:

我认为,这三个表之间的标准内部连接,其索引定义在reports.datereports.customer_idcustomers.manager_id 列上,如评论中所述(此外考虑managers.idcustomer.id 列作为预计是已经有唯一索引的主键)从性能的角度来看就足够了:

SELECT m.id, count(r.id)
  FROM customers c
  JOIN managers m ON r.customer_id = c.id
  JOIN reports r ON  m.id = c.manager_id
 WHERE r.date BETWEEN NOW() - INTERVAL '7 days' AND NOW()
   AND r.decision = 'ACCEPTED'
 GROUP BY m.id

【讨论】:

    猜你喜欢
    • 2019-05-13
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 2018-05-17
    • 2010-10-24
    相关资源
    最近更新 更多