查询执行时间过长

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' 是一个字符串。如果INVDATEDATE datatype 列,则强制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 子句中涉及的列是否已编入索引?如果没有,请这样做

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

【讨论】:

以上是关于查询执行时间过长的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 查询执行时间过长

MySQL innoDB:查询执行时间过长

小表上的简单 SQL 查询执行时间过长

oracle olap 查询执行时间过长

Hive 查询执行时间过长

Mongodb 查询执行耗时过长