查询需要太多时间来执行

问题描述 投票:0回答:1

我正在使用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);

请优化它。

sql oracle oracle10g
1个回答
1
投票

你没有提供太多信息。查询本身几乎没用(就像你打电话给机制并说“我的蓝色车很慢。为什么?”)。

无论如何,一些提示;也许他们会帮忙的。

  • '01-Feb-2018'是一个字符串。如果INVDATEDATE数据类型列,那么您就迫使Oracle在VARCHAR2DATE之间执行隐式转换。请改用日期文字,例如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子句索引的列?如果没有,请这样做

最后,解释计划会有所帮助。没有它,人们就会部分失明。

© www.soinside.com 2019 - 2024. All rights reserved.