Můžete to zkusit pomocí vícekrokové tabulkové funkce. Tímto způsobem je server nucen zhmotnit výsledky TVF do proměnné tabulky. Také to můžete zkusit použití deklarativních omezení při deklaraci tohoto typu tabulky (PRIMARY KEY, UNIQUE, CHECK) ke zlepšení výkonu konečného dotazu:
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;
Nezapomeňte přidat ORDER BY
klauzule k vašemu závěrečnému dotazu.
Nedávno jsem toto řešení použil k optimalizaci pohledu (ViewA, DISTINCT + LEFT JOIN + GETDATE()) používaného jinými pohledy (ViewB). V tomto případě (ViewA) nebylo možné vytvořit indexovaný pohled (kvůli DISTINCT + LEFT JOIN + GETDATE()). Místo toho jsem vytvořil vícepříkazový TVF, který zlepšil výkon snížením logických čtení (v některých případech drasticky) konečného dotazu.
Poznámka:Samozřejmě to můžete zkusit pomocí zobrazení indexu .