Você pode tentar usando uma função com valor de tabela de várias etapas. Desta forma, o servidor é forçado a materializar os resultados do TVF em uma variável de tabela. Além disso, você pode tentar usando restrições declarativas ao declarar este tipo de tabela (PRIMARY KEY, UNIQUE, CHECK) para melhorar o desempenho da consulta final:
CREATE FUNCTION CocoJamboSchema.CocoJamboFunction(@parameters ...)
RETURNS @Results TABLE (
Col1 INT NOT NULL,
Col2 VARCHAR(10) NULL,
...
PRIMARY KEY(Col1)
)
AS
BEGIN
WITH MyCTE (...)
AS
(
...
)
INSERT @Results (...)
FROM MyCTE;
RETURN;
END;
SELECT ...
FROM CocoJamboSchema.CocoJamboFunction(param values) f
INNER JOIN MySchema.MyTable t ON f.Col1=t.Col1
ORDER BY t.Col1;
Não se esqueça de adicionar o
ORDER BY
cláusula para sua consulta final. Recentemente, usei esta solução para otimizar uma visualização (ViewA, DISTINCT + LEFT JOIN + GETDATE()) usada por outras visualizações (ViewB). Neste caso (ViewA) foi impossível criar uma view indexada (por causa de DISTINCT + LEFT JOIN + GETDATE()). Em vez disso, criei um TVF multi-instrução que melhorou o desempenho reduzindo as leituras lógicas (drasticamente em alguns casos) da consulta final.
Observação:claro, você pode tentar usando uma exibição de índice .