0

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

4

1 回答 1

0

这可能不是完整的答案,但扩展 sql 查询以进一步限定字段名称:[table].[field]。我假设“组”是 group_mtm 中的一个字段,但看起来您正在尝试将“foobar”表分配给它?

于 2015-03-02T23:10:38.433 回答