我有一个带有内部连接的 SQL Server 2012 存储过程,执行时间为 7,387 毫秒(我在 Activity Monitor 中看到了它):
[...]
declare @childrenIds as dbo.CodeIdList;
[...]
Update
dbo.Code
set
dbo.Code.CommissioningFlag = 21
From
dbo.Code
INNER JOIN
@childrenIds c
ON
dbo.Code.CodeId = c.CodeId
CodeIdList
是:
CREATE TYPE [dbo].[CodeIdList] AS TABLE (
[CodeId] INT NULL
);
有没有比使用 更新代码表更快的方法INNER JOIN
?
我不是 dba,所以我不知道您是否需要有关我的问题的更多详细信息。如果您需要它们,请询问。
我sp_helpindex
在代码表上运行了这些结果:
索引名称 | index_description PK_CODE | 位于 PRIMARY 上的聚集的、唯一的主键 | 代码ID UC_CODE_SERIAL | 位于 PRIMARY | 上的非聚集、唯一、唯一键 串行
Code
建表脚本:
CREATE TABLE [dbo].[Code] (
[CodeId] INT IDENTITY (1, 1) NOT NULL,
[Serial] NVARCHAR (20) NOT NULL,
[ ...]
CONSTRAINT [PK_CODE] PRIMARY KEY CLUSTERED ([CodeId] ASC),
CONSTRAINT [UC_CODE_SERIAL] UNIQUE NONCLUSTERED ([Serial] ASC)
)
此时代码表中有 1.006.896 行。
执行计划:
XML 版本位于http://pastebin.com/9yXsRfva
SQL Server 版本信息:
Microsoft SQL Server Management Studio 11.0.6020.0 Herramientas cliente de Microsoft Analysis Services 11.0.6020.0 Microsoft Data Access Components (MDAC) 6.1.7601.17514 微软 MSXML 3.0 4.0 6.0 微软 Internet Explorer 9.11.9600.18314 微软 .NET 框架 4.0.30319.42000 手术系统 6.1.7601
Select @@VERSION
:
Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) 2015 年 10 月 20 日 15:36:27 版权所有 (c) Microsoft Corporation Enterprise Edition(64 位) Windows NT 6.1(内部版本 7601:Service Pack 1)
我已经添加了这个索引,它已经将连接加速到 0ms 平均持续时间:
我在解决我之前的问题时偶然找到了解决方案。
您没有指明您的服务包级别,但您可能想查看Aaron Bertrand 的这篇关于 2012 Service Pack 2 跟踪标志的帖子,该标志“可能”在加入表变量时提高性能。根据帖子:
此外,看看使用临时表而不是表变量是否会产生影响会很有趣。
发布“实际”执行计划的 XML 可能会为我们提供有关如何执行连接的更多信息。
我会添加一个 <> 21 所以它可以跳过任何已经设置的
如果 CodeID 在 CodeIdList 中是唯一的,那么将其声明为 PK 可能会有所帮助
UPDATE
声明_建议
@childrenIds
应该是唯一的而不是空的。尝试
并在填充时遵守此约束
@childrenIds
(注意不要尝试在任何时候插入重复项或 NULL)CodeId
。@childrenIds