查询重写和调优
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 代码。顺便说一句,这很容易做到:只需突出显示您的查询并按下
按钮。以上是关于查询重写和调优的主要内容,如果未能解决你的问题,请参考以下文章