一尘不染

我怎么知道为什么在某个表上插入很慢?

sql-server

我知道 SQL 表上的 INSERT 可能由于多种原因而变慢:

  • 表上存在 INSERT TRIGGER
  • 许多必须检查的强制约束(通常是外键)
  • 当在表中间插入一行时,聚集索引中的页面拆分
  • 更新所有相关的非聚集索引
  • 阻止桌子上的其他活动
  • IO写响应时间差
  • …我错过了什么?

在我的具体情况下,我如何判断哪个负责?如何衡量页面拆分与非聚集索引更新与其他所有内容的影响?

我有一个存储过程,一次插入大约 10,000 行(来自临时表),每 10k 行大约需要 90 秒。这是不可接受的慢,因为它会导致其他 spid 超时。

我查看了执行计划,看到了 INSERT CLUSTERED INDEX 任务和 FK 查找中的所有 INDEX SEEKS,但它仍然不能确定为什么需要这么长时间。没有触发器,但该表确实有一些 FKey(似乎已正确索引)。

这是一个 SQL 2000 数据库。


阅读 105

收藏
2022-11-09

共1个答案

一尘不染

有些东西你可以看看…

将批量大小从 10000 减小到更小的值,例如 2000 或 1000(你没有说你的行大小有多大)。

尝试打开 IO Stats 以查看 FK 查找占用了多少 IO。

插入时发生的等待是什么(master.dbo.sysprocesses)?

让我们从这里开始,看看我们要去哪里。

2022-11-09