插入多于特定数量的行时,INSERT需要5个小时以上


8

当向表中插入少于1,350,000行的数据时,整个过程大约需要2分钟,但是,如果插入的行数较大,则插入数据所需的时间将增加到大约5小时。

该问题与查询或索引无关,因为很长一段时间以来一切正常,并且查询,表或索引的结构没有任何变化。

问题大约在2周前首次出现,并且在插入的行数大于+ -1,350,000的情况下在几天内反复出现。例如,一天中插入的行数为1,200,000,过程需要2分钟,另一天,行插入的数为1,450,000,插入数据需要5-6个小时。

我试图重建索引,但没有帮助。


3
插入的来源是什么?
马丁·史密斯

4
当插入花费这么长时间时,您能发布与之相关等待时间吗?
Kin Shah 2014年

4
除非您提供更多信息,否则我们只能猜测。我的猜测是锁升级正在发生。您能追踪等待并锁定升级
吗?Shanky

1
这是您第一次尝试插入130万条记录吗?你在做交易吗?批量导入?您正在执行哪种日志记录?我同意,如果您要进行普通jane插入,请尝试分批进行插入。
SQLburn 2014年

2
如何导入数据(bcp,批量插入,SSIS,批处理文件)?来自哪里(本地存储,相同/不同的驱动器,网络存储等)?什么是表架构?什么是导入命令?有什么执行计划(如果是普通的T-SQL)?
玛丽安2014年

Answers:


14

我的猜测是-如果您实际上并未受到阻止-您达到的阈值是数据文件(和/或日志文件)必须增长的阈值,并且您的配置未经过优化以支持这种增长。确保这件事:

  1. 您的数据文件增长率是合理的,并且其大小足以容纳此事务以及可能同时发生的任何其他事情的固定大小(不是%!)。
  2. 日志文件相同。
  3. 即时文件初始化已启用。这将有助于加快数据文件的增长,但不会帮助解决通常更为麻烦的日志文件的增长。
  4. 您不会在一个循环中插入135万个单独的行,或者不是全部作为一项大事务来插入。对于将您的交易分成多个部分,有话要说

1
亚伦很在意他的建议,听起来像是数据或日志文件的文件增长。另外,请确保您的虚拟日志文件数很少。
Namphibian 2014年

4

这可能是内存问题吗?

如果某些必须重复访问的数据块对于内存而言变得太大,并且您从地狱中遭受磁盘撞击,则可能会看到这种行为。如果必须遍历对内存来说太大的数据块,那么每次交换都会从交换文件中读取整个内容,将其推到该限制之上可能会导致性能下降。


3

您是否尝试/可以将它们分成较小的批次?当我遇到类似的问题时,将它们按5.000(使用GO)进行分组确实缩短了完成此任务所需的时间。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.