【发布时间】: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