Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL具有多个where条件,速度极慢_Sql_Oracle_Performance_Select - Fatal编程技术网

Oracle SQL具有多个where条件,速度极慢

Oracle SQL具有多个where条件,速度极慢,sql,oracle,performance,select,Sql,Oracle,Performance,Select,我在HibernateSQL查询中发现了一个奇怪的行为。我的查询中有多个and/or语句。如果我将查询拆分为三个不同的查询,那么即使需要进行额外的选择,查询速度也会快得多 但这是什么原因?我该如何解决?我只做了两个select语句,所以我认为问题出在其他地方 我的问题是: Select * from zdadba.tpartner partner where partner.partnrext in ( select disti

我在HibernateSQL查询中发现了一个奇怪的行为。我的查询中有多个and/or语句。如果我将查询拆分为三个不同的查询,那么即使需要进行额外的选择,查询速度也会快得多

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

我的问题是:

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'
              )
             );

您正在使用的两种结构往往与响应缓慢有关。一种是使用子查询作为in运算符的目标。另一个是OR运算符

您通常可以将与子查询一起使用的查询重写为具有联接的等效查询。结果往往更快。对不起,在这种情况下我懒得帮你

您可能别无选择,只能使用OR运算符。有时,您可以想出一种替代方法,使用UNION组合结果集,但这种方法通常运行缓慢


祝你好运

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