查询重写和调优

Posted

技术标签:

【中文标题】查询重写和调优【英文标题】:Query rewrite and Tuning 【发布时间】:2019-12-03 12:45:41 【问题描述】:

我有以下查询是性能下降的原因,有人可以帮助重写这个查询,以便它可以更好地执行。

SELECT * 
FROM   (SELECT ITEMDETAIL0_.depid AS COL_0_0_ 
        FROM   xxxxxxxxxx.rptdepitemdetails ITEMDETAIL0_ 
               cross join xxxxxxxxxx.xxxxxxxxxxorg ORGANIZATI1_ 
        WHERE  ITEMDETAIL0_.bankname =? 
               AND ITEMDETAIL0_.customerid = ORGANIZATI1_.id 
               AND ORGANIZATI1_.uniquename =? 
               AND ITEMDETAIL0_.createuser =? 
               AND ITEMDETAIL0_.createdate >=? 
               AND ITEMDETAIL0_.createdate <=? 
               AND ( ITEMDETAIL0_.captureworktype IN ( ? ) ) 
               AND ( ITEMDETAIL0_.depstatus IN ( ?, ? ) ) 
        GROUP  BY ITEMDETAIL0_.depid, 
                  ITEMDETAIL0_.createdate 
        ORDER  BY ITEMDETAIL0_.createdate ASC) 
WHERE  ROWNUM <= ? 

【问题讨论】:

(1) 用您正在使用的数据库标记您的问题。 (2) 你为什么将JOIN 表示为CROSS JOIN?使用ON 子句! 你需要说出你想要达到的目标。查看您的查询,我可以说让CROSS 加入无论如何都需要时间 很多时候查询调整不依赖于重写查询,而是正确规范化数据和智能使用索引。 能否添加查询的解释计划?正确诊断您的问题会容易得多。 @Jaisus - 添加了解释计划 【参考方案1】:

您可以编写如下查询以避免交叉连接和使用ON。

SELECT * 
FROM   (SELECT ITEMDETAIL0_.depid AS COL_0_0_ 
        FROM   xxxxxxxxxx.rptdepitemdetails ITEMDETAIL0_ 
               join xxxxxxxxxx.xxxxxxxxxxorg ORGANIZATI1_  on ITEMDETAIL0_.customerid = ORGANIZATI1_.id 
        WHERE  ITEMDETAIL0_.bankname =? 
               AND ORGANIZATI1_.uniquename =? 
               AND ITEMDETAIL0_.createuser =? 
               AND ITEMDETAIL0_.createdate >=? 
               AND ITEMDETAIL0_.createdate <=? 
               AND ( ITEMDETAIL0_.captureworktype IN ( ? ) ) 
               AND ( ITEMDETAIL0_.depstatus IN ( ?, ? ) ) 
        GROUP  BY ITEMDETAIL0_.depid, 
                  ITEMDETAIL0_.createdate 
        ORDER  BY ITEMDETAIL0_.createdate ASC) 
WHERE  ROWNUM <= ?

此外,在 xxxxxxxxxxorg 的 id 列和 rptdepitemdetails 表的 customerid 和 depid 上创建索引会有所帮助。

【讨论】:

我已经为你格式化了你的 SQL 代码。顺便说一句,这很容易做到:只需突出显示您的查询并按下 按钮。

以上是关于查询重写和调优的主要内容,如果未能解决你的问题,请参考以下文章

MySQL调优--04---explain

索引实践和调优

[转帖]sysctl.conf学习和调优

Redis监控工具,命令和调优

SQL Server超时诊断和调优

使用DMV,诊断和调优DB性能。