3

我有一个按日期(按天)分区的表和字段(包括日期字段)的本地索引。如果我进行查询:

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 秒。

如何优化这个查询?可能我需要在提取(从日期开始的月份)和提取(从日期开始的年份)上创建本地索引吗?

4

1 回答 1

7

由于您在日期字段上有一个索引,因此您应该以可以使用该索引的方式编写查询。这对于 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');
于 2011-08-17T07:54:36.970 回答