对表中插入(简单和 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 秒左右的旧数据)
最佳答案
我想到了几件事:
- 恢复模式是什么(可以将其设置为简单)吗?
- 表上是否有很多当前可能需要更新的索引(尝试删除,直到导入完成,然后添加)
- 您是否有必须引用但没有索引的 FK。可能是读取争用
- 您确定要对磁盘进行读/写操作吗?这可能会给您带来一些线索。
- 是否存在长时间运行的事务?
其中一些问题的答案可能会告诉您系统中存在哪些实际挑战。
关于sql - 优化对不相关表的大量插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24530652/