【发布时间】:2014-08-23 05:12:13
【问题描述】:
对表中插入(简单和 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 很快恢复正常,但在重新启动并达到类似的写入阈值后,情况再次出现。没有迹象表明这种情况即将到来 - DB 要么非常快,要么无法使用
什么不起作用:
- 从头开始创建 A、B、C、D(使它们为空) - 即使使用 里面有几千条记录,情况重复。
- 从头开始将 A、B、C、D 创建为堆(没有任何索引)
我们要做什么:
- 通过 BCP 插入这些数据;但是还有 5 个其他表 也需要使用这种方法——他们最终也会有 插入频率很高,但需要提供最多 1 秒的数据。
实际问题:
- 我们还能看到 BCP 堵塞吗?
- 我们是否应该以某种方式限制最大并行运行 BCP 独立表? (每个表只有一个 BCP 线程,但是 将有大约 9 张桌子,其中较大的一半可以有几分钟 延迟数据,很少有表需要大约 1 秒的旧数据)
【问题讨论】:
-
您对每个表的插入是否同时发生?这听起来像是一个锁升级问题(但如果单个线程在一个表上串行处理所有插入,则不可能)。我也有点想知道你的行大小是否正常,至于你的平均表(没有 blob 或大字符串),即使是逐行也应该每秒至少管理几千个插入,而 BCP,比如每秒 50k .如果您使用的是 ADO.NET,请查看 SqlBulkCopy(您不需要运行命令行实用程序)。
-
@TheDag 是的 - 目前所有插入都是并发的 - 所以我们从多个线程插入到单个表。但是 ActivityMonitor 没有显示任何死锁(并且没有事务以死锁受害者的身份结束 - 一切都超时了)。行应该最大每行大约 1KB(有几个数值和 2-3 个小 varchar 值和一个 varchar(1024)) )。但是仍然担心新设计是否会再次出现问题。
-
当一切都“阻塞”时,你会得到什么等待类型?
-
@MartinSmith 大多数插入被一个正在进行的插入阻塞(来自 sp_who2) - 即使插入 A 有时也会被插入 B 阻塞,尽管它们没有相互引用(或没有触发器)更新同一张表);唯一常见的是一些“枚举表”的 FK 很少。找出等待链顶部插入的实际等待类型(那些未阻塞的)是一个好点 - 将尝试找出那些(一旦我将在隔离的测试环境中进行复制)。谢谢!
-
插入的方法好像有什么大问题。我的数据仓库设置不那么令人印象深刻,我的插入(批量插入,每个表 1 个线程)很容易做到每张表每秒 5k 到 10k,同时最多 3 个表。你能分享更多关于你在做什么的数据吗?您使用什么程序/过程/命令来插入数据、任何奇异的数据库配置等。
标签: sql sql-server performance bcp