Sql CTE与合并性能
前言,使用MS SQL Server 2008标准 我正在编写一个应用程序,其中该存储过程代码非常重要,并且会经常被许多用户同时调用 代码的目标是更新整型列,考虑传入的值和整型键上的匹配 从逻辑上讲,我的问题是,当平均项目列表为10项时,哪种方法应该产生最佳性能 我已经分析了这两种查询,它们的性能似乎与我的示例数据相似,但我无法模拟执行的数千个并发查询 存储过程的参数为:Sql CTE与合并性能,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,前言,使用MS SQL Server 2008标准 我正在编写一个应用程序,其中该存储过程代码非常重要,并且会经常被许多用户同时调用 代码的目标是更新整型列,考虑传入的值和整型键上的匹配 从逻辑上讲,我的问题是,当平均项目列表为10项时,哪种方法应该产生最佳性能 我已经分析了这两种查询,它们的性能似乎与我的示例数据相似,但我无法模拟执行的数千个并发查询 存储过程的参数为: @items dbo.KeyValueTable READONLY 其中,KeyValueTable是一种用户定义的类型,
@items dbo.KeyValueTable READONLY
其中,KeyValueTable
是一种用户定义的类型,它有两列,key
和value
类型均为INT
CTE
合并
谢谢大家! 运行这两个命令,同时查看统计io输出和实际计划?为什么只在更新时进行合并?Merge是为在同一语句中执行更新/插入而创建的。@JamesZ两者都相同:CTE执行10次逻辑读取和1次扫描。Merge执行10次逻辑读取和1次扫描。@Dave.Gugg的CPU估计值是相同的。在这种情况下,我只对更新函数感兴趣。合并还可以处理删除。为什么?因为我想对一组数据而不是RBAR进行更新。如果其中一个部分导致我对承诺数量的限制失效,我也希望整个声明失效。这就像吃饭时用烤箱手套拿起叉子一样。你能做到,但为什么?在这种情况下不要使用Merge,这是不必要的。
;WITH itemsToCommit
AS (
SELECT i.[key]
,i.value
,s.committedQuantity
FROM dbo.ItemStock s
INNER JOIN @items i ON s.itemId = i.[key]
)
UPDATE itemsToCommit
SET committedQuantity = committedQuantity + [value];
MERGE dbo.ItemStock AS t
USING (
SELECT i.[key] AS itemId
,i.value AS quantity
FROM @items i
) AS s(itemId, quantity)
ON t.itemId = s.itemId
WHEN MATCHED
THEN
UPDATE
SET t.committedQuantity = t.committedQuantity + s.quantity;