SQL Server 2008 R2。
运行如下所示的简单更新命令
UPDATE [group_mtm] SET group = foobar where user in (u1,u2,u3,...u19)
该查询仅更新 1 行,但耗时超过 2 秒。这是一个 2 属性表,用作多对多连接。表现在只有大约 300 条记录。主键 = 组和用户属性的复合键。
我已经设置了统计信息来检查它,并且查询执行涉及一堆其他不涉及业务的表:
Table 'foobar'. Scan count 1, logical reads 21214, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 1664, logical reads 42674, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'mail_mtm'. Scan count 1, logical reads 428, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'event'. Scan count 1, logical reads 893, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'user'. Scan count 0, logical reads 91, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'addresses'. Scan count 1, logical reads 12, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'mail'. Scan count 1, logical reads 79, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'links'. Scan count 1, logical reads 18, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'group_mtm'. Scan count 20, logical reads 120, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
(20 row(s) affected)
(1 row(s) affected)
我唯一能想到的是 foobar 是和索引视图,也许成本是花在维护它上,所以我检查了执行计划;它确实发挥了作用(但只有 11% 的成本)。
为什么需要 2+ 秒?
我在这里俯瞰什么?
执行计划建议我在事件上添加一个索引,但这里甚至不应该涉及事件,它只有 13% 的成本。
如果不是由于某种原因其他桌子被拉入其中,我觉得这应该是闪电般的快。
有人可能会给我关于索引视图增加一般数据库开销的明智建议;但是,所有其他操作如厕,对于更快地查找索引视图提供的某些查询来说,成本似乎相当高。
教我; 谢谢,麻烦您了!
XML 执行计划太大而不能作为文本发布,我没有看到附加选项,所以 pastebin 来救援: http: //pastebin.com/BgjBxLfc