【发布时间】:2020-08-10 17:25:01
【问题描述】:
当我使用解释计划时,我需要优化 where 子句查询以降低成本。
以下是原文
create index idx on orders(o_orderdate)
select *
from orders
where (to_char(o_orderdate, 'dd-mon-yy') = '23-MAR-97' and o_totalprice > 2) or (not o_custkey > 3 and to_char(o_orderdate, 'dd-mon-yyyy') = '23-MAR-1997');
这是我从原始查询中得到的解释计划
但是当我尝试使用这个查询来优化它时
select *
from orders
where o_totalprice > 2
and o_custkey < 3
and o_orderdate >= to_date('23MAR97', 'dd-mon-yy')
and o_orderdate <= to_date('24MAR1997', 'dd-mon-yyyy');
它返回没有选择的行
如何优化原来的 where 查询仍然返回 4500 行?
【问题讨论】:
-
任何时候你把一个函数放在比较的左侧(其中 to_char(my_date)... 你消除了在该列上使用索引的可能性(除非你有一个基于函数的索引). 另外,比较日期时,需要比较 DATE,而不是 to_char 字符表示。另外,请务必始终使用 4 位数年份,不要重新创建 Y2k 错误。