Eu tenho um procedimento armazenado do SQL Server 2012 com uma junção interna que leva 7.387ms para executar (vi no 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
);
Existe uma maneira mais rápida de atualizar a tabela Code do que usar um INNER JOIN
?
Não sou dba, então não sei se você precisa de mais detalhes sobre minha pergunta. Se você precisar deles, por favor, pergunte.
Eu executei sp_helpindex
na tabela de códigos com estes resultados:
index_name | índice_descrição PK_CODE | chave primária agrupada, exclusiva, localizada em PRIMARY | CodeId UC_CODE_SERIAL | chave exclusiva, não clusterizada e exclusiva localizada em PRIMARY | Serial
Code
script de criação de tabela:
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)
)
Neste momento existem 1.006.896 linhas na tabela Code.
Plano de execução:
Versão XML em http://pastebin.com/9yXsRfva
Informações da versão do 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 Microsoft Internet Explorer 9.11.9600.18314 Microsoft .NET Framework 4.0.30319.42000 Sistema operativo 6.1.7601
Select @@VERSION
:
Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) 20 de outubro de 2015 15:36:27 Copyright (c) Microsoft Corporation Enterprise Edition (64 bits) em Windows NT 6.1 (Compilação 7601: Service Pack 1)
Eu adicionei este índice e ele acelerou a junção para 0ms de duração média:
Encontrei a solução por acaso, ao resolver minha pergunta anterior .
Você não indicou seu nível de service pack, mas talvez queira verificar esta postagem de Aaron Bertrand sobre um sinalizador de rastreamento do Service Pack 2 de 2012 que ' pode ' melhorar o desempenho ao unir variáveis de tabela. De acordo com a postagem:
Além disso, seria interessante ver se o uso de uma tabela temporária em vez de uma variável de tabela pode fazer diferença.
Postar o XML do(s) plano(s) de execução 'reais' pode nos fornecer mais informações sobre como sua junção está sendo realizada.
Eu adicionaria um <> 21 para que ele possa pular qualquer um que já esteja definido
Se CodeID for único em CodeIdList, declará-lo como PK provavelmente ajudaria
a
UPDATE
declaraçãosugere
@childrenIds
deve ser único e não nulo.Tente
e observe essa restrição ao preencher
@childrenIds
(tenha cuidado para não tentar inserir duplicado ou NULLCodeId
em@childrenIds
nenhum ponto).