我正在使用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);
请对其进行优化。
答案 0 :(得分:1)
您没有提供太多信息。查询本身几乎没有用(就好像您叫机械师说“我的蓝车很慢。为什么?”)。
无论如何,有一些提示;也许他们会帮忙。
'01-Feb-2018'
是一个字符串。如果INVDATE
是DATE
数据类型列,则您将强制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
也影响性能。此外,它选择一个 substring 。你需要它吗?如果没有,请将其删除WHERE
子句中涉及的列是否已编制索引?如果没有,那么最后,解释一下计划会有所帮助。没有它,人们就会部分失明。