【问题标题】:How to optimize oracle query from partitioned table?如何优化分区表的oracle查询?
【发布时间】:2011-10-28 16:46:39
【问题描述】:

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

SELECT * FROM table t WHERE t.fdate = '30.06.2011'

很快就完成了,但是当我完成时

SELECT * FROM table t WHERE EXTRACT(month from t.fdate) = 6 AND EXTRACT(t.fdate 的年份) = 2011

大约需要 200 秒。

如何优化这个查询?我可能需要在 EXTRACT(month from date) AND EXTRACT(year from date) 上创建本地索引吗?

【问题讨论】:

    标签: performance oracle oracle10g partitioning date-arithmetic


    【解决方案1】:

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

    【讨论】:

    • @Codo:我遇到过类似的问题,我相信您的回答会让此类查询运行得更快。但我猜它提高性能的原因是因为它启用了分区修剪,而不是因为它允许使用索引。
    • 如果我执行与您的解决方案相同的查询,但包括 HHMMSS(在我们的某些数据中,我们的时间戳甚至可能一直到毫秒)- 我们是否仍会从分区中受益?
    • @fa1c0n3r:是的,它也适用于更高的精度。但是,如果您有毫秒精度,那么您将不得不使用 TIMESTAMP 列(而不是 DATE 列),由于它使用时区而更加复杂。
    • 我明白了,好的,感谢您查看。这就是我认为我所看到的,但只是确保它仍然是一个有效的解决方案,因为大小变得相当大,我们希望减少所有查询时间......
    猜你喜欢
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 2011-01-30
    相关资源
    最近更新 更多