【问题标题】:Updating an indexed column with NULL values使用 NULL 值更新索引列
【发布时间】:2015-05-25 21:53:49
【问题描述】:

我在名为 TouchTime 的 DATETIME YEAR TO FRACTION 列上有一个 dups 索引,我用它作为时间戳来定位当前工作日最近插入或更新的行。我最近将此列添加到具有约 800K 行的表中。平均更新 7,000 行,每个工作日插入 300 行。在用户开始在下一个工作日插入或更新行之前,我将表中具有前一个工作日时间戳的所有行的时间戳列更新为 NULL。

当使具有时间戳的约 7,300 行无效时,它对索引条目有什么影响?.. 他们在索引文件中的叶子位置是否保持在同一个位置?.. 当用户开始添加和更新工作日的行时,使用索引的查询会自动绕过时间戳值为空的行吗?

【问题讨论】:

  • 您的描述听起来像 Oracle。你应该用你实际使用的数据库来标记你的问题。
  • 我正在寻找标记数据库的反馈,因为这些服务器上的处理方式可能不同

标签: sql sql-server oracle indexing informix


【解决方案1】:

如果索引的时间戳列的几行设置为空,则索引表中行的位置将被移动。 SQL Server 将所有索引保存在 Btree Plus 中,从而使所有索引树始终保持平衡且深度相同。

【讨论】:

  • 哇,那么每次将索引列设置为NULL时重新定位叶节点的成本一定非常昂贵!
  • 与可能导致其他页面拆分的页面拆分相比,将单个指针移动到行并不是一项昂贵的操作。
【解决方案2】:

在 Oracle 中,您必须重建索引。对 NULL 的这种更新对于 Oracle 数据库来说是一个非常不愉快的操作。

【讨论】:

  • 如果要更新为 NULL 的列是主键,我可以理解重建索引,但它不是,所以当我只取消 ~7,300 时,为什么我必须重建索引 ~ 800K 行?.. 索引列上的 NULLS 是否会使索引过时?
  • 在 Oracle 中,它是否是主键并不重要。索引只是被空的叶子节点弄乱了,因为 NULL 值不是索引的一部分。在 Oracle 中,这使我尽可能避免在数据中使用 NULL,这样至少我的查询计划更加可靠。
  • 在某些情况下,缺少值是有用的,有时甚至是必要的,尤其是对于时间值。
  • @FrankComputerAtYmailDotCom :我同意这一点,但 Oracle 在索引模型中不同意。
  • 好的,很高兴知道,因为 Oracle 10g 是我经常使用的数据库之一,而 Informix 11.70 是另一个。
猜你喜欢
  • 2021-12-01
  • 2017-11-15
  • 2018-01-09
  • 1970-01-01
  • 2021-08-28
  • 2022-11-12
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
相关资源
最近更新 更多