Estou tentando ajustar a consulta abaixo, que leva de 15 a 16 segundos, independentemente do valor passado como parâmetro, a consulta é:
select distinct d.documentpath as path, d.documentname as name, d.datecreated as created, pc.DateProcessed
from datagatheringruntime dgr
inner join processentitymapping pem on pem.entityid = dgr.entityid
inner join document d on d.entityid = pem.entityid or d.unitofworkid = pem.processid
left join PendingCorrespondence pc on pc.PendingCorrespondenceId = d.PendingCorrespondenceId
where rootid = @P0 and dgr.name in('cust_pn', 'case_pn')
OPTION(RECOMPILE)
Eu atualizei as estatísticas para todas as tabelas tocadas pela consulta (excluindo a DataGatheringRuntime
tabela que é bastante grande em ~ 100GB
) e tentei refatorar a consulta usando um CTE
mas obtive o mesmo plano de execução e preciso de alguma assistência.
O plano de execução real pode ser encontrado aqui:
https://www.brentozar.com/pastetheplan/?id=ByUVIqlFE
Está claro no plano de execução que o problema está na entrada externa nested loop join
especificamente com o lazy table spool
seguinte do índice scan
não clusterizado na tabela, mas não tenho ideia de como resolver esse problema e gostaria de receber qualquer orientação.IX_Camunda_1
Document
Eu tentaria remover a
OR
cláusula na junção entredocument
eprocessingentitymapping
Você poderia fazer isso com
UNION
A razão é que o carretel da mesa está alimentando o
NESTED LOOPS
operadorE neste operador de loops aninhados está o
OR
predicado.Filtrando até que tenhamos 9 linhas restantes.
Alterar o
OR
para aUNION
deve remover o spool, talvez seja necessário examinar a indexação após remover o arquivoOR
.Índices que podem melhorar o desempenho após reescrever com
UNION
Veja aqui outro exemplo sobre isso
Em vez de processar
DataGatheringRuntime table which is quite big at ~100GB)
várias vezes, processe-as uma única vez, colocando-as em#temp
tabelaouCTE
Em seguida, remova
Distinct
. Se houver dados duplicados, encontre o motivo por trás dos dados duplicados e remova os dados duplicados escrevendo a consulta correta.Qual é o propósito
Distinct
eUNION
na mesma consulta?