我有一个按日期(按天)分区的表和字段(包括日期字段)的本地索引。如果我进行查询:
SELECT * FROM table t WHERE t.fdate = '30.06.2011'
它很快就实现了,但是当我制作时
SELECT * FROM table t WHERE EXTRACT(month from t.fdate) = 6 AND EXTRACT(year from t.fdate) = 2011
大约需要 200 秒完成。
如何优化这个查询?我可能需要在 EXTRACT(从日期开始的月份)和 EXTRACT(从日期开始的年份)上创建本地索引?
最佳答案
由于您在日期字段上有索引,因此您应该以可以使用该索引的方式编写查询。这对于 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');
关于performance - 如何优化分区表的oracle查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7089410/