【问题标题】:Index on a column updated very frequently列上的索引更新非常频繁
【发布时间】:2016-03-24 15:16:59
【问题描述】:

我需要在列上创建索引以获得更好的性能。该列是时间戳类型,并且是基于函数的索引。 问题是:此专栏更新非常频繁。

Oracle 文档说不要索引经常修改的列。

那么有没有更好的方法来查询这个列?

编辑

在以下查询中,列是 VALIDATIONTIME:

select * 
from orders 
where VALIDATIONTIME between
  TO_TIMESTAMP('2016/03/06 10:45:18', 'YYYY/MM/DD HH24:MI:SS')
and
  TO_TIMESTAMP('2016/03/15 19:50:18', 'YYYY/MM/DD HH24:MI:SS');

【问题讨论】:

  • 只有在有助于解决性能问题的情况下才应建立索引。诀窍是找出流程中的瓶颈。如果您的更新花费的时间太长 - 不要创建索引,如果您的选择是您的问题 - 请创建一个。没有要遵循的单一规则,Oracle 的文档仅推荐在这些情况下的最佳实践。
  • 正如上面提到的人,它只是一个权衡。为您的应用程序测试它,并根据最终目标权衡结果。

标签: sql oracle indexing


【解决方案1】:

时间戳有助于确保高基数,因此它可能是一个不错的选择,但它实际上取决于您用于访问数据的谓词。 只有在不同的工作单元中单独插入行时,时间戳列才会具有良好的基数! 现在我对这个表或其使用模式一无所知,但这实际上取决于您用来访问数据的谓词。

我们很少询问精确到微秒发生了什么的问题。所以很少见where timestamp_column = some precise value 形式的谓词。您更有可能看到诸如where timestamp_column between :ts1 and :ts2 之类的范围表达式,而且该谓词通常会有伴侣。

所以作为一个粗略的概括,你可以考虑:

  • 将时间戳列作为复合索引的第二列或后续列
  • 将表定义为以一天、一周或一个月的开始和结束时间戳为界的范围分区,如果基数和分布证明它是合理的;或
  • 甚至完全从索引键中删除时间戳并将其与唯一索引一起存储。

全部取决于查询特征。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    相关资源
    最近更新 更多