【问题标题】:Why do I have to rebuild the indexes on a table after inserting >150,000 records?为什么插入超过 150,000 条记录后必须重建表上的索引?
【发布时间】:2014-07-28 19:31:17
【问题描述】:

我有一个日常流程,将大约 150,000 条记录导入两个表,然后将它们连接起来与其他数据进行比较。

我在表上创建了索引,这使得比较过程非常快。不幸的是,在导入过程之后,我的索引上的碎片急剧上升,通常超过 50%。然后我必须重建索引才能运行比较查询。

这对我来说没有意义。插入数据时,索引不应该适当地更新自身吗?索引上是否有任何属性会影响此行为?

编辑: 一些额外的信息——我有两张桌子。在导入过程中,一张表通过插入/选择语句添加了大约 150,000 行。另一个表在应用程序级别从 SQLBulkCopy 获取 150,000 行。

【问题讨论】:

  • 你的插入效果如何?
  • 阅读有关树重新平衡的信息,例如here,这将帮助您了解为什么应该重新构建索引
  • 感谢@Lashane,这很有道理——但是否可以在插入项目时“重新平衡”索引?
  • 您可以为每个索引指定一个FILL FACTOR。这可以减少碎片的百分比,并减少在添加/更新行时频繁地重建/重组索引的需要。请注意 - 有一些取舍...
  • @Slider345 是可能的,但是操作繁重且需要时间,因此如果每次插入后将重新平衡整棵树 - 几周后将插入 150,000 行,因此需要权衡,只是养成习惯:在每次批量表更新后 - 重建索引并更新统计信息

标签: sql sql-server tsql indexing


【解决方案1】:

但索引正在正确更新自身。
除非您完全按照索引的顺序添加数据,否则索引将分段。

需要考虑的几点:

  • 能否按索引顺序插入数据?
    这将减少碎片化。
  • 考虑删除索引,插入数据,然后重建索引。
    如果你得到 50% 的碎片,那么这很可能会更快。 碎片索引会减慢插入速度。
  • 如果您必须让索引保持热状态,请考虑使用 50% 的填充因子。
    这将显着降低插入碎片的速度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多