我正在使用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);
请优化它。
你没有提供太多信息。查询本身几乎没用(就像你打电话给机制并说“我的蓝色车很慢。为什么?”)。
无论如何,一些提示;也许他们会帮忙的。
'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
也会影响表现。而且,它选择一个子串。你需要它吗?如果没有,请将其删除WHERE
子句索引的列?如果没有,请这样做最后,解释计划会有所帮助。没有它,人们就会部分失明。