Eu tenho a consulta SQL abaixo que é executada em avg. 40 segundos e preciso de alguma orientação onde posso melhorá-lo ou possivelmente reescrever:
Declare @status_D INT,
Declare @StatusIP INT,
Declare @Status_F INT,
SELECT @status_D = Id From Batchtablestatus (NOLOCK) Where desc ='Value1';
SELECT @StatusIP = Id From Batchtablestatus (NOLOCK) Where desc ='Value2';
SELECT @Status_F = Id From Batchtablestatus (NOLOCK) Where desc ='Value3'
BEGIN TRAN
UPdate U
SET
U.[id]= @StatusIP,
U.[EnabledDate]= Getdate()
OUTPUT deleted.col1,
deleted.col2,
deleted.col3,
deleted.col4,
Inserted.id
FROM (
SELECT TOP 5000 * FROM BatchChangeTable WITH (ROWLOCK,UPDLOCK)
WHERE [id] IN ( @status_D ,Status_F)
ORDER BY [ModifiedTime] )U;
COMMIT TRAN
Estou recebendo aviso do blitzcache como serialização forçada, classificação Expensive, non-sargable e Merge join "Mant to Many" = True
O único índice que tínhamos está em id, que é um índice NC com id como coluna de chave principal.
Vou tentar atualizar minha pergunta se plano de execução, se puder. A tabela no SELECT é de cerca de 100 milhões a partir de agora. Também tem PK/CI em col1.
Perguntei aos usuários por que fazemos * nesse TOP que puxa quase 50+ colunas, mas na atualização uso apenas menos, talvez esteja pensando errado, mas só veio à minha mente.
Adicionar índice ao tempo modificado também não parece ajudar.
Por favor, sugira o que mais pode ser verificado. Obrigado
Avisos
OUTPUT
(sem destino ou para uma@table
variável causará isso, mas não uma#temp
tabela)ModifiedTime
sem um índice de suporte e padrão de consultaComo corrigi-lo
Você precisará de um bom índice de suporte:
Mas a maneira como a consulta é escrita
IN
será interpretada como um predicado de intervalo eORDER BY ModifiedDate
provavelmente ainda causará uma operação de classificação. Você precisará alterar o formulário para usar dois predicados de igualdade com aUNION ALL
para aproveitar ao máximo o índice.Você também precisará reescrever sua consulta para usar SQL dinâmico para não ser atingido pelos efeitos colaterais das variáveis locais .
O produto final será mais ou menos assim:
Você precisará adaptar isso um pouco para se adequar à sua situação real, mas deve levá-lo na direção certa.
ideias com base nas informações disponíveis:
código: