我知道 SQL 表上的 INSERT 可能由于多种原因而变慢:
- 表上存在 INSERT TRIGGER
- 许多必须检查的强制约束(通常是外键)
- 当在表中间插入一行时,聚集索引中的页面拆分
- 更新所有相关的非聚集索引
- 阻止桌子上的其他活动
- IO写响应时间差
- ...我错过了什么?
在我的具体情况下,我如何判断哪个负责?如何衡量页面拆分与非聚集索引更新与其他所有内容的影响?
我有一个存储过程,一次插入大约 10,000 行(来自临时表),每 10k 行大约需要 90 秒。这是不可接受的慢,因为它会导致其他 spid 超时。
我查看了执行计划,看到了 INSERT CLUSTERED INDEX 任务和 FK 查找中的所有 INDEX SEEKS,但它仍然不能确定为什么需要这么长时间。没有触发器,但该表确实有一些 FKey(似乎已正确索引)。
这是一个 SQL 2000 数据库。
有些东西你可以看看...
将批量大小从 10000 减小到更小的值,例如 2000 或 1000(你没有说你的行大小有多大)。
尝试打开 IO Stats 以查看 FK 查找占用了多少 IO。
插入时发生的等待是什么(master.dbo.sysprocesses)?
让我们从这里开始,看看我们要去哪里。
布拉德,
您应该检查查询的等待统计信息。使用 SQL2000,您可以使用 DBCC SQLPERF("waitstats") 语法来获取这些详细信息。
在分析查询的性能时,我可以说出我在寻找什么。也许它有帮助。
尝试使用:
和
统计 IO
统计资料
建议: