【问题标题】:Oracle-SQL with multiple where-conditions extremely slow具有多个 where 条件的 Oracle-SQL 非常慢
【发布时间】:2015-01-17 00:17:52
【问题描述】:

我在我的(休眠)SQL 查询中发现了一个奇怪的行为。我的查询中有多个和/或语句。如果我将查询拆分为三个不同的查询,那么即使我必须进行额外的选择,查询也会快得多。

但这是什么原因造成的,我该如何解决呢?我只做了两个选择语句,所以我认为问题出在其他地方。

这是我的查询:

Select * from zdadba.tpartner partner where
             partner.partnrext in (
                     select distinct stapel.fpartnrext from zdadba.tstapel stapel
                     where stapel.lagernd = 1
                     and stapel.auftrag_id is null and 

                 (
                     (
                         cast(stapel.version as date) <= to_date('30.06.' || to_char(EXTRACT(YEAR FROM sysdate)), 'DD.MM.YYYY')
                     ) and
                     (
                         to_date(sysdate) >= to_date('30.06.' || to_char(EXTRACT(YEAR FROM sysdate)), 'DD.MM.YYYY')
                     )
                        and
                     (
                        partner.versandart = 'Halbjaehrlich'
                     )                      
                 )
                or
                 (
                    (
                        cast(stapel.version as date) <= to_date('01.01.' || to_char(EXTRACT(YEAR FROM sysdate)), 'DD.MM.YYYY')
                    ) and
                     (
                         to_date(sysdate) <= to_date('30.06.' || to_char(EXTRACT(YEAR FROM sysdate)), 'DD.MM.YYYY')
                     )
                 )
                    and partner.versandart = 'Halbjaehrlich'
             or 
              (
                 (
                     (
                         cast(stapel.version as date) <= to_date('01.01.' || to_char(EXTRACT(YEAR FROM sysdate)), 'DD.MM.YYYY')
                     ) and
                     (
                         to_date(sysdate) >=  to_date('01.01.' || to_char(EXTRACT(YEAR FROM sysdate)), 'DD.MM.YYYY')
                     )
                 )  and partner.versandart = 'Jaehrlich'
              )
             );

【问题讨论】:

  • 您的第二个“OR”条件......看起来您不小心遗漏了“and partner.versandart”,这将是其他模式的逻辑缺陷。此外,对于所有日期转换,您实际上想要做什么,因为有些是 >= 其他
  • 您的stapel 表中有多少记录?您在此表中的索引是什么?您的索引类型是什么?您使用了太多的日期转换、比较和提取,每一项都会影响查询的整体性能

标签: sql oracle performance select


【解决方案1】:

您使用的两种结构往往与响应缓慢有关。一种是使用子查询(“in”运算符的目标)。另一个是 OR 运算符。

您通常可以将使用带有子查询的 IN 的查询重写为带有 JOIN 的等效查询。结果通常更快。

您可能别无选择,只能使用 OR 运算符。有时,您可以想出一个替代方案,使用 UNION 来组合结果集,但通常运行速度也很慢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-13
    • 2019-09-16
    • 2020-06-16
    • 2013-04-10
    • 1970-01-01
    • 2023-02-21
    • 2021-11-07
    • 2012-02-23
    相关资源
    最近更新 更多