加速SQL插入语句

时间:2014-01-30 10:31:17

标签: sql .net sql-server-2008

我遇到一个问题,即每个小时都会运行一个速度越来越慢的问题,并且每天会将大约3-4百万行插入到SQL Server 2008数据库中。

模式由一个包含所有上述数据的大表组成,并在日期时间字段(按天)上有聚簇索引,在字段组合上有唯一索引以排除重复插入,还有一些2个varchar字段的索引。

最近的典型行为是插入语句在完成之前暂停一段时间。整个过程过去需要4-5分钟,现在通常超过40分钟。

插入由.net服务执行,该服务解析一系列xml文件,执行一些数据转换,然后将数据插入数据库。该服务根本没有改变,只是插入的时间比他们使用的时间长。

此时我愿意尝试一切。请告诉我您是否需要更多信息并随时提出建议。

提前致谢。

2 个答案:

答案 0 :(得分:1)

听起来你已经用尽了缓冲池的能力来缓存插入过程所需的所有页面。附加样式的插入(与日期表一样)具有非常小的工作集,只有几页。随机样式插入基本上将整个索引作为其工作集。如果在随机位置插入行,则必须首先读取应该写入该行的现有页面。

这可能意味着大量的磁盘寻求插入。

确保在一个语句中插入所有行。使用批量插入或TVP。这允许SQL Server通过按键值对插入进行排序来优化查询计划,从而使IO更有效。

然而,这将没有实现大的加速(在类似的情况下我已经看到了5倍)。要重新获得原始性能,必须将工作集恢复到内存中。添加RAM,清除旧数据或分区,这样您只需触摸很少的分区。

答案 1 :(得分:1)

在插入之前删除索引并在完成时设置它们