优化大量插入到不相关的表中

时间:2014-07-02 12:03:10

标签: sql sql-server performance bcp

是否有任何(记录或已知的未记录的)限制插入物(简单和BCP)的最大支持频率到表中;并将最大并行高频插入到独立表中?

我们有4个表(A,B,C,D),它们位于同一个数据库(sql server 2012,ultimate)中,并且它们有自己的文件组 - 一个文件组用于那些大表,另一个用于其他数据 - 目前都在相同的SSD磁盘。恢复模式很简单,日志文件位于单独的SSD磁盘上。 A,B,C,D按时间顺序索引(每个都有一个单一的聚簇索引,按时间顺序排列),插入按时间顺序排列。没有从表中读取。通过对每个新记录执行插入SP来执行插入。我们每秒向每个表插入几十条记录。 一切正常(sql server上的CPU接近0%,sql server上的数据文件和日志文件磁盘的磁盘时间接近0%),直到超过插入频率的某个阈值(我没有确切的数字,但是~100个插入每秒)数据文件磁盘的I / O(写入和读取)为100%,DB不可用,并且(几乎)所有尝试插入超时。停止我们的服务后,DB很快恢复正常,但在重新启动并获得类似的写入情况重复之后。没有迹象表明这种情况即将来临 - 数据库要么非常快,要么无法使用

什么没有用?

  • 从头开始创建A,B,C,D(因此它们是空的) - 即使是 里面有成千上万的记录,情况重演。
  • 从头开始创建A,B,C,D作为堆(没有任何索引)

我们要做什么:

  • 通过BCP插入这些数据;但是还有其他5个表 也需要使用这种方法 - 他们最终也会 插入频率高,但需要提供最长1秒的数据。

实际问题:

  • 我们还可以看到BCP堵塞吗?
  • 我们应该以某种方式限制最大并行运行的BCP 独立表? (每个表只有一个BCP线程,但是 将有~9张桌子,其中较大的一半可以有几分钟 延迟数据,少数表需要大约1秒的旧数据)

1 个答案:

答案 0 :(得分:0)

有些事情会浮现在脑海中:

  1. 什么是恢复模式(可以将其设置为简单)?
  2. 您是否有很多可能需要当前更新的表的索引(尝试删除直到导入完成,然后添加)
  3. 你是否必须引用FK但没有索引。它可能是读取争用
  4. 您是否确定了对磁盘的读/写?这可能会让你有所了解。
  5. 是否有长时间运行的交易?
  6. 其中一些问题的答案可能会让您对系统中的实际挑战有所了解。