【问题标题】:Batch index updates?批量索引更新?
【发布时间】:2011-10-29 20:21:21
【问题描述】:

我一次将几百行或可能几千行写入一组表中,每个表都大量在内部和通过索引视图进行索引。

通常,插入发生在插入的行在索引中相邻的位置。

我预计这些插件会很昂贵,但它们真的很慢。我认为部分性能问题是索引会随着每个单独的 INSERT 进行更新。

有没有办法告诉 SQL Server 推迟更新索引,直到我完成我的一批插入,以便索引树只需要更新一次?

由于需要在保存和记录任何单个问题期间向用户显示进度条,因此这些语句作为单独的语句执行,但它们都来自 C# 中的同一连接。如果需要,我可以将它们放入事务中,但我不想这样做。

【问题讨论】:

  • “几千行”不是很多。应该几乎是即时的......当然我们不知道你有什么硬件......
  • 我在表的末尾插入可能有几千行,但表有几百万行。速度问题肯定在于更新索引。硬件是最新的,并且数据库在此特定任务期间表现良好。

标签: sql-server-2005 tsql indexing


【解决方案1】:

您付出了以一种或另一种方式将这些行添加到索引的成本。在插入期间不更新索引会导致并发语句的准确性出现问题 - 该表上使用任何索引的任何查询都不会“看到”新行!

如果速度至关重要,并且插入后的停机时间不是主要问题,您可以:

  • 在目标表上禁用非聚集索引
  • 惰性
  • 重建非聚集索引

您可能应该进一步说明您的桌子:

  • 桌子有多宽?
  • 有多少索引?
  • 索引有多宽?

如果您有 20 个索引并且每个索引有 5 个字段,那么您实际上是在每行更新 100 个额外字段,这会很快变得昂贵。

【讨论】:

  • 是的,我知道我最终会付钱的,但我认为每个索引的单独编辑数量让我很头疼。插入的行在各种索引中几乎总是行相邻的,所以我希望有一种方法可以使用事务并减少对这些索引页面的单独编辑次数。
  • 我不确定您对“个人编辑”部分的理解。如果您向表中添加 10 行,则无论您如何旋转它,都需要对每个索引进行 10 次更新。
  • 是的,索引有 10 次更新,但有 10 次索引页面锁定/写入/解锁操作。我希望由于更改应该影响相对较少的索引页面,因此我可以推迟索引更新,以便它们以最少数量的锁定和写入发生。
  • 其他人可能会过来纠正我,但我认为锁定不会成为瓶颈。与将数据实际写入索引页面所花费的时间相比,为锁定/写入一次而不是每行一次所节省的时间最少,这是以一种或另一种方式发生的。
猜你喜欢
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多