Tenho uma view que está com sérios problemas de performance, pois estou vinculando ela a uma CTE que usa outra view, com as mesmas referências de tabela.
WITH
splits(ID, [NEW TEU])
AS
(SELECT s.[DTL ID] AS ID, s.[NEW TEU]
FROM [POTS].[vwSPLITCARGO] AS s)
SELECT *
FROM [MISNT].[CARGO_MANIFEST_DETAIL_VIEW] AS cmd
LEFT JOIN splits AS s ON s.ID = cmd.ID
A vwSPLITCARGO
exibição faz referência à mesma CARGO_MANIFEST_DETAIL_VIEW
tabela para obter seus cálculos.
Eu sei porque é lento . É porque a vwSPLITCARGO
view está lendo todos os dados da mesma CARGO_MANIFEST_DETAIL_VIEW
view para cada registro já no CTE. Na verdade, o vwSPLITCARGO
está sempre retornando o mesmo pequeno conjunto de registros (aproximadamente 4 ou 6 registros). Eu não preciso disso para obter esses registros o tempo todo. Uma vez seria ótimo!
Existe uma maneira de fazer o CTE se comportar como uma tabela temporária , na medida em que recupera os registros uma vez e não é processado repetidamente?
Algo a dizer ao CTE:CASE WHEN RunOnce = 0 THEN "do it" ELSE "don't do it" END
Não há dica de consulta para spool ou materializar um CTE. Portanto, use uma tabela temporária e, opcionalmente, indexe a tabela temporária.