sql - 优化对不相关表的大量插入

标签 sql sql-server performance bcp

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

我们有 4 个表(A、B、C、D)驻留在同一个数据库(sql server 2012,旗舰版)中,并且它们有自己的文件组 - 一个文件组用于这些大表,另一个文件组用于其他数据 - 两个文件组当前都在同一个SSD盘。恢复模式很简单,日志文件位于单独的 SSD 磁盘上。 A、B、C、D 按时间顺序建立索引(每个索引都有一个按时间顺序排列的聚集索引),并且插入按时间顺序发生。没有从表中读取数据。通过对每个新记录执行 insert 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张 table ,其中一半可以有几分钟的时间 延迟数据,很少有表需要有 1 秒左右的旧数据)

最佳答案

我想到了几件事:

  1. 恢复模式是什么(可以将其设置为简单)吗?
  2. 表上是否有很多当前可能需要更新的索引(尝试删除,直到导入完成,然后添加)
  3. 您是否有必须引用但没有索引的 FK。可能是读取争用
  4. 您确定要对磁盘进行读/写操作吗?这可能会给您带来一些线索。
  5. 是否存在长时间运行的事务?

其中一些问题的答案可能会告诉您系统中存在哪些实际挑战。

关于sql - 优化对不相关表的大量插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24530652/

相关文章:

php - 并非所有字段都插入到 MySQL 表中

sql - Microsoft Access 2010 中 SQL 查询的最大长度?

sql - 触发器检查表中某行的某些值是否相等然后更新,如果不相等则插入

python - 用未知键初始化一个大字典?还有比这更好的方法吗?

java - 更新 sqlite 中的查询

sql - 存储过程 - 从带有联接的表中删除

c# - 使用外部 SQL Server 2008 R2 更新 linq 中的语句

c# - nHibernate SetFirstResult & SetMaxResults 问题

javascript - 合并 javascript 文件是否有助于加快 IE8 中的网站速度?

performance - Oracle,更新语句如何工作