我按日期(按天)分区表和字段上的本地索引(包括日期字段)。如果我提出疑问:
SELECT * FROM table t WHERE t.fdate = '30 .06.2011'
很快就会实现,但是当我做出
时SELECT * FROM table t WHERE EXTRACT(从t.fdate开始的月份)= 6 AND EXTRACT(来自t.fdate的年份)= 2011
它完成了大约200秒。
如何优化此查询?可能我需要在EXTRACT上创建本地索引(从日期开始的月份)和EXTRACT(从日期开始)?
答案 0 :(得分:6)
由于您在日期字段上有索引,因此您应该以可以使用此索引的方式编写查询。这对于EXTRACT函数是不可能的,因为Oracle必须遍历所有数据并计算每行的条件以确定它是否匹配。
如果您有特定日期或日期范围,则可以使用日期索引。在您的情况下,您正在寻找一系列日期。所以查询可以写成:
SELECT * FROM TABLE T
WHERE T.FDATE BETWEEN TO_DATE('1.6.2011', 'DD.MM.YYYY') AND TO_DATE('30.6.2011', 'DD.MM.YYYY');