【问题标题】:Speed-up SQL Insert Statements加速 SQL 插入语句
【发布时间】:2014-02-22 14:28:59
【问题描述】:

我正面临一个问题,该进程每小时运行一次,每天向 SQL Server 2008 数据库中插入大约 3-4 百万行数据。

该架构由一个包含上述所有数据的大表组成,并在日期时间字段(按天)上有一个聚集索引、一个字段组合上的唯一索引以排除重复插入,以及更多2 个 varchar 字段的索引。

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

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

在这一点上,我愿意尝试一切。请让我知道您是否需要更多信息,并随时提出任何建议。

提前致谢。

【问题讨论】:

  • 插入,你的意思是“追加”,绝对没有更新。我假设你的意思是 3-4 百万行是标准插入并且没有改变。
  • 另外,如果这是每天添加 3-4 百万行。是否有任何东西被清除或数据大小只是在增长?
  • 这似乎并不奇怪,你在表中的数据越多,你的唯一索引索引就越大,因此读取和检查以确保没有重复的时间越长正在插入的数据。您还必须在插入完成后更新所有索引,这将花费更多的数据。
  • 此外,由于您的聚集索引位于日期时间字段上,如果您不只插入新数据(即插入的所有日期时间都比表中的最后一个日期时间新),您的索引将是越来越分散。
  • 感谢所有 cmets,我的意思是添加新数据,是的,插入的日期时间实际上是时间戳,因此它们本质上是增量的

标签: sql .net sql-server-2008


【解决方案1】:

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

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

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

但是,这不会实现很大的加速(我在类似情况下看到了 5 倍)。要恢复原始性能,您必须将工作集重新带入内存。添加 RAM、清除旧数据或分区,以便您只需要触及很少的分区。

【讨论】:

  • 插入时似乎在偷看的唯一资源是磁盘使用情况。除了 RAM 和 CPU 使用率非常低
  • 您如何评估 RAM 使用情况? (老实说,我不相信您在这里的观察,并希望确保它是正确的。)表的聚集索引有多大(以 GB 为单位)以及您为 SQL Server 配置了多少内存?不要使用 Taskmanager 值,它们具有误导性。
  • 我只有任务管理器值可以使用。分配的 RAM 为 10GB。
  • 好吧,看看这张桌子有多大。还可以找到索引大小。您可以右键单击数据库并选择 Reports->Disk Usage by Partition。您设置的最大服务器内存是多少?服务器有多少 RAM?
【解决方案2】:

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

【讨论】:

  • 3 年后,他将拥有 9 亿行。您通常不会为 3-4m 插入删除此类索引。太贵了。此外,这会使流程脱机。
  • 这不是一个选项。索引的重新创建需要很长时间才能完成
  • 删除/创建索引的过程会导致非常大的插入速度提高一个数量级,包括重新创建索引。此外,您可能不需要删除所有索引,删除一些可能会产生戏剧性的结果。
猜你喜欢
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多