SQL - 在我的WHERE子句中使用2个日期是多余的?

时间:2013-06-20 16:39:09

标签: sql oracle indexing

我有一个查询(我在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之前成为一个约会,它会被忽视吗?执行计划显示很少: Execution Plan

提前谢谢!

2 个答案:

答案 0 :(得分:1)

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

索引可以阻止全表扫描 - deleted上的索引或DateSeen上的索引(因为您排除了DateRecorded上的索引)。

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

但是,Oracle可以不使用这样的索引。该决定基于收集的关于该表的统计数据。

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

答案 1 :(得分: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'))

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

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