2011-08-18 113 views
0

我一次写入数百或可能几千行到一组表中,其中每一个都是重度在内部和通过索引视图索引。批量索引更新?

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

我希望这些插入物很贵,但他们是真的很慢。我认为性能问题的一部分是索引正在更新与每个单独的插入。

有没有办法告诉SQL Server阻止更新索引,直到我完成了一批插入操作,因此索引树只需要更新一次?

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

+0

“几千行”不是很多。应该几乎是即时的......当然,我们不知道你有什么硬件...... –

+0

我在表格末尾插入了几千行,但表格有几百万行。速度问题肯定是在更新索引。硬件是非常流行的,并且在此特定任务期间数据库执行得很好。 – richardtallent

回答

0

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

如果速度是至关重要的,并且插入后停机是不是大问题,您可以:对目标表

  • 禁用非聚集索引
  • 惰性
  • 重建非-clustered指标

你或许应该澄清一些你们的表:

  • 桌子有多宽?
  • 有多少个索引?
  • 指数有多宽?

如果您有20个索引,并且每个索引有5个字段,那么您确实会更新每行100个额外的字段,这些字段可能会很快变得很贵。

+0

是的,我知道我最终会付钱,但我认为每个索引的单独编辑数量是什么让我失望。插入的行在各种索引中几乎总是与行相邻,所以我希望有一种方法可以使用事务并减少对这些索引页进行单独编辑的次数。 – richardtallent

+0

我不确定你在“个人修改”部分得到什么。如果您将10行添加到表中,则无论您如何旋转它,都需要对每个索引进行10次更新。 – JNK

+0

是的,索引有10个更新,但有10个索引页锁定/写入/解锁操作。我希望,因为这些变化应该会影响相对较少的索引页面,所以我可以推迟索引更新,以便它们以最小数量的锁定和写入出现。 – richardtallent