【问题标题】:High performance data insert into SQL Server高性能数据插入 SQL Server
【发布时间】:2013-06-10 16:32:39
【问题描述】:

我在 SQL Server 的一个表中插入了大约 700 万行。该表有大约 9-10 列,它在 2 个键(列)上有一个 clustered index 和另外 3 个 unclustered indexes. 我正在尝试执行高性能/批量插入数据,但插入 3 后它变得很慢万条记录,磁盘使用率高达 99%。以下是我为加快此过程所做的工作:

1) 禁用所有非聚集索引。我没有禁用2列聚集索引,因为禁用聚集索引后无法插入数据?

2) 我每次使用 C# SqlBulkCopy 批量插入 5,000 条记录。

3) 表没有任何约束和触发器

我应该做些什么来加快这个数据插入过程?

【问题讨论】:

标签: c# sql sql-server database sql-server-2012


【解决方案1】:

摆脱所有索引。每次使用索引写入时,都必须在写入每条记录时重新构造物理页面。使用代码 (DROP INDEX) 转储所有索引,插入数据,然后使用代码 (CREATE INDEX) 重新构建索引。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 未经彻底调查,请勿提出此类行动!有人可能因此丢掉工作。
    • 摆脱索引这一公认的答案,与暂时更改恢复模式以进行大插入相比同样危险。
    【解决方案3】:

    正如 spender 所说,您的集群索引可能是个问题。您可能会以未对集群索引进行排序的方式插入数据。因此,SQL Server 必须创建大量只有一个条目的页面,并在看到大量稀疏填充的数据包时进行优化。 尝试使用自动生成的 int 索引。如果您不能这样做,请在将它们插入 SQL 之前对整个批量数据进行排序(基于聚集索引列 - 顺序很重要)。这应该可以最大限度地减少磁盘使用量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 2019-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多