1

我有一个查询(我在 Oracle DB 上运行),它看起来像:

SELECT 
Column1,Column2,Column3 FROM MyDatabase.MyTableName 
WHERE 
(DELETED = 0) 
AND (DATESEEN > TO_DATE ('20/03/2013 12:00:00', 'DD/MM/YYYY HH24:MI:SS'))
AND (DATERECORDED  >= TO_DATE('20/06/2013 06:00:00', 'DD/MM/YYYY HH24:MI:SS')) 
AND (DATERECORDED < TO_DATE('20/06/2013 12:00:00', 'DD/MM/YYYY HH24:MI:SS'))

查询是动态生成的,动态值如下:

where 子句 (DATESEEN) 的第二行是 90 天前。
where 子句的第三行是查询最后一次运行的时间。(通常是 12 小时前)
where 子句的最后一行是现在的时间。

DATERECORDED 上没有索引,但 DATESEEN 上有。由于我无法控制的原因,我无法在 DATERECORDED 上建立索引。

我的 WHERE 子句中的“DATESEEN”行是完全多余的吗?由于 DATESEEN 总是比 DATERECORDED 早很多,它会被忽略吗?执行计划透露的很少: 执行计划

先感谢您!

4

2 回答 2

1

您在 上没有索引DateRecorded。为了满足该where子句,Oracle 需要进行全表扫描,读取所有记录。

索引可以防止全表扫描——索引 ondeleted或索引 on DateSeen(因为您已经排除了索引 on DateRecorded)。

如果这两个字段上没有索引,则该子句是多余的。如果有,它可以显着减少查询的 I/O。不如在 DateRecorded 上有一个索引,但它可能很多——特别是如果你有 10 或 20 年的数据。

但是,Oracle 可以随意不使用这样的索引。该决定基于收集的有关表的统计信息。

另一个考虑因素是分区。如果表按 分区DateSeen,则将其放在where子句中允许数据库选择正确的分区来满足查询。使用其他列是不可能的。

于 2013-06-20T17:07:55.597 回答
0

这一行:

AND (DATERECORDED  >= TO_DATE('20/06/2013 06:00:00', 'DD/MM/YYYY HH24:MI:SS')) 

不是多余的,因为它增加了额外的过滤。

这一行:

AND (DATERECORDED < TO_DATE('20/06/2013 12:00:00', 'DD/MM/YYYY HH24:MI:SS'))

可能是多余的。如果记录的日期总是在过去,并且您总是检查小于当前日期,那么它就是。

您的 datesee 行可能是多余的,也可能不是多余的。如果它添加过滤或加速查询,则不是。否则,它是。

于 2013-06-20T16:54:42.973 回答