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