查询需要太多时间来执行

时间:2019-04-11 06:16:24

标签: sql oracle oracle10g

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

请对其进行优化。

1 个答案:

答案 0 :(得分: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也影响性能。此外,它选择一个 substring 。你需要它吗?如果没有,请将其删除
  • WHERE子句中涉及的列是否已编制索引?如果没有,那么

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