高性能数据插入到SQL Server

4
我正在将大约700万行数据插入到SQL Server中的一张表中。该表有9-10列,其中2个键(列)上有一个聚集索引和3个非聚集索引。我尝试进行高性能/批量数据插入,但在插入了300万条记录后速度会变得相当慢,磁盘使用率达到了99%。以下是我为加速此过程所做的操作:
1)禁用所有非聚集索引,但没有禁用2列聚集索引,因为禁用聚集索引后无法插入数据。
2)我使用C#的SqlBulkCopy批量插入每次5000条记录。
3)该表没有任何约束和触发器。
还有什么我可以做来加快这个数据插入过程吗?

1
请返回翻译文本。 - Matt Ball
1
将要插入的数据按照聚集索引的顺序进行排序。 - spender
我不会对任何粗心的“切换到简单恢复模式”的评论进行负面评价,但只有当你真正知道你在做什么时才这样做。否则请忽略这样的建议。 - OzrenTkalcecKrznaric
3个回答

2

去掉所有的索引。每次你使用索引写入数据时,物理页面都必须在写入每个记录时重新结构化。通过代码(DROP INDEX)删除所有索引,插入您的数据,然后使用代码(CREATE INDEX)重新构建索引。


1

确保数据库处于恢复模式BULK LOGGED或SIMPLE,至少在您插入所有记录之前。这将防止事务日志文件膨胀。


1
不要在没有彻底调查的情况下建议这样的行动!由于此举,有人可能会失去工作。 - OzrenTkalcecKrznaric
摆脱索引,被接受的答案是同样甚至更加危险的,比起临时更改恢复模式来进行大量插入。 - Ross Presser

1
根据Spender的说法,你的集群索引可能存在问题。你可能以一种无序的方式插入数据,导致集群索引未排序。因此,SQL服务器必须创建许多只有一个条目的页面,并在看到许多稀疏填充的数据包时进行优化。尝试使用自动生成的int索引。如果无法这样做,请在将它们插入SQL之前对整个批量数据进行排序(基于集群索引列 - 排序很重要)。这应该最大限度地减少磁盘使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接