Há algo que eu possa fazer para melhorar o desempenho dessa consulta? Incluí o plano de execução e a saída do Server Profiler. Existe um índice que pode ajudar? Vejo que há uma busca de índice que está demorando algum tempo. Posso fazer alguma coisa para ajudar nisso? no perfil do servidor vejo que as leituras parecem altas, pode haver algo para ajudar nisso?
SELECT dbo.Templates.VersionKey
FROM dbo.Templates INNER JOIN
dbo.Indications ON dbo.Templates.Id = dbo.Indications.TemplateId INNER JOIN
dbo.Sentences ON dbo.Indications.SentenceId = dbo.Sentences.Id INNER JOIN
dbo.SentenceParts ON dbo.Sentences.Id = dbo.SentenceParts.SentenceId INNER JOIN
dbo.SentencePartValues ON dbo.SentenceParts.Id = dbo.SentencePartValues.SentencePartId
WHERE (dbo.Templates.Status <> 8) AND
(dbo.Templates.IsCurrentVersion = 1) AND
(dbo.Indications.IsActive = 1) AND
(dbo.Indications.IsCurrentVersion = 1)
AND (NOT (Sentences.[IsDeleted] = 1))
AND (NOT (SentenceParts.[IsDeleted] = 1))
AND (NOT (SentencePartValues.[IsDeleted] = 1))
and
(SUBSTRING(dbo.SentencePartValues.LiteralValue, 12, 36) = 'a2278339-8add-ff3d-8baa-9654b8b8d00b')
plano de execução https://www.brentozar.com/pastetheplan/?id=By68aKtfp
sim
Não use substring na sua cláusula where:
Todo o tempo nesta consulta é gasto buscando 25.219.726 linhas em e
SentencePartValues
, em seguida, aplicando o filtro/substring emLiteralValue
.Claro, é fácil dizer isso, mas na prática não adianta muito.
Pode ser mais fácil para você fazer uma
LIKE
pesquisa com caracteres curinga duplos, mas seLiteralValue
for um n/varchar(max) ou sql_variant, então você está ferrado de qualquer maneira.Talvez seja necessário adicionar uma coluna computada à tabela e indexá-la adequadamente para sua consulta.
ALTER TABLE dbo.SentencePartValues ADD LV_substring AS TRY_CAST(SUBSTRING(dbo.LiteralValue, 12, 36) AS uniqueidentifier);
ou
ALTER TABLE dbo.SentencePartValues ADD LV_substring AS TRY_CAST(SUBSTRING(dbo.LiteralValue, 12, 36) AS varchar(36));
O
TRY_CAST
to uniqueidentifier poderá falhar se determinados valores acabarem na substring que não pode ser convertida.Adicionar a coluna sem a
PERSISTED
palavra-chave impedirá que ocorra uma longa operação de bloqueio enquanto você adiciona a coluna. Claro, como eu disse, você precisará indexá-lo para que seja útil em geral.Você pode usar
ONLINE = ON
se estiver na Enterprise Edition, caso contrário terá que omiti-lo e sofrer.