查询执行时间过长
Posted
技术标签:
【中文标题】查询执行时间过长【英文标题】:Query takes too much time for execution 【发布时间】:2019-04-11 06:16:24 【问题描述】:我正在使用 Oracle 10g。以下查询花费了太多时间:
SELECT invno, invdate, ccode
FROM acct
WHERE invno IS NOT NULL
AND invdate > '01-Feb-2018'
AND invno LIKE '%' || :ppassingmn.dept || '%'
AND invno NOT IN (SELECT DISTINCT (vdescript)
FROM genldgr
WHERE vchrno LIKE 'IV%'
AND trandate > '01-Feb-2018'
AND vdescript LIKE
'%' || :ppassingmn.dept || '%')
ORDER BY SUBSTR (invno, 12, 15);
请优化一下。
【问题讨论】:
您可能想要添加一个执行计划。 我不确定,也许你可以试试这个。with acct1 as (select distinct (vdescript) vdescript from genldgr where vchrno like 'IV%' and trandate > '01-Feb-2018' and vdescript like '%' || :ppassingmn.dept || '%') select invno, invdate, ccode from acct,acct1 where acct.invno is not null and acct.invdate > '01-Feb-2018' and acct.invno like '%' || :ppassingmn.dept || '%' and acct.invno !=acct1.vdescript order by substr(acct.invno, 12, 15);
请在您的问题中添加执行计划。另外,acct.invdate 和 genldgr.trandate 列的数据类型是什么?如果它们是日期,请将您的日期字符串明确转换为日期(例如to_date('01/02/2018', 'dd/mm/yyyy')
)。
如果genldgr.vdescript
被定义为可以为空,那么假设这是您的要求,请尝试将where vdescript is not null
添加到子查询中。
【参考方案1】:
您没有提供太多信息。查询本身几乎没用(好像你打电话给机械师说“我的蓝色车很慢。为什么?”)。
无论如何,一些提示;也许他们会有所帮助。
'01-Feb-2018'
是一个字符串。如果INVDATE
是DATE
datatype 列,则强制Oracle 在VARCHAR2
和DATE
之间执行隐式转换。改用日期文字,例如and invdate > date '2018-02-01'
。 TRANDATE
也是如此。
LIKE
很慢。你用了两次。看看能不能改写成invno = :passingmn.dept
。顺便问一下,:passingmn.dept
是什么?看起来像一个变量,但是 - 那个点在这里做什么? VDESCRIPT
也是如此。
DISTINCT
要求您选择所有行,然后删除重复项。看来您并不真正关心它,所以 - 删除 DISTINCT
。
由于INVNO
必须看起来像某个参数值,因此它不是NULL
,因此您可能可以删除invno is not null
条件。
ORDER BY
也会影响性能。此外,它选择一个子字符串。你需要它吗?如果没有,请删除它
WHERE
子句中涉及的列是否已编入索引?如果没有,请这样做
最后,解释计划会有所帮助。没有它,人们就会部分失明。
【讨论】:
以上是关于查询执行时间过长的主要内容,如果未能解决你的问题,请参考以下文章