【问题标题】:Oracle partition performanceOracle 分区性能
【发布时间】:2017-08-06 09:57:29
【问题描述】:

我有一个包含超过 6 亿条记录的大型 oracle 表,我们只是对它们进行了重新分区,以便我们可以在不增加日志大小的情况下清除一些旧数据。

问题是有一些查询会进行全索引扫描,并且运行频率很高,例如每秒 300 次。在分区查询之前需要大约 0.15 秒,但在分区之后需要 0.50 秒到 1.25 秒。有谁知道分区 oracle 表会降低查询的性能?如果是,你能说出原因吗?似乎有一些文章,但不够清楚,我无法理解。

【问题讨论】:

    标签: sql oracle performance partition


    【解决方案1】:

    如果索引是本地的并且查询不是基于分区键(意思是:分区修剪是不可能的)但高度选择性的工作量将与您创建的分区数量成比例地增加。如果您有 30 个分区,则必须搜索 30 个索引来查找您的值。每个索引较小的事实不会被较大数量的索引所抵消。 (您可能想看看 btree 索引是如何工作的,以了解为什么不是这种情况)。

    长话短说:如果您使用全局索引,您应该能够避免这个问题。

    【讨论】:

    • 很好的答案,但我认为引入了一个新问题:删除分区会影响全局索引。
    • 谢谢@fhossfel 我会检查
    • 是的,必须重建全局索引,这可能需要一些时间。您可以在删除/截断分区时指定“更新索引”子句
    【解决方案2】:

    当有分区表时,如果你对这个表有很多选择查询,总是在WHERE子句中包含Paritioncoloumn =value。

    如果分区基于 日期 类型 (PERSISTED_DATE) 列的示例

    查询

    SELECT * FROM TABLE_NAME WHERE COLOUMN1='VALUE' and trunc(PERSISTED_DATE)=trunc(sysdate);
    

    注意事项。

    1. 如果是高跨国表,请避免使用全局索引,否则必须在删除分区后建立全局索引。
    2. 为了获得更好的性能,减少分区数量,您可以每天自动创建新分区并删除旧分区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      • 2020-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多