Методы материализации T-SQL CTE не работают на SQL Server 2012

Я должен использовать следующие методы для материализации моих CTE и повышения производительности просмотра:

WITH CTE AS(
    SELECT TOP 100 PERCENT
    ORDER BY ...
)

WITH CTE AS(
    SELECT TOP 2147483647
    ORDER BY ...
)

Теперь ни один из этих способов не работает. Кто-нибудь сталкивался с такой же проблемой или знает, если в SQL Server 2012 эти вещи не действительны?

1 ответ

Решение

Вы можете попробовать использовать многошаговую табличную функцию. Таким образом, сервер вынужден материализовать результаты TVF в табличную переменную. Кроме того, вы можете попробовать использовать декларативные ограничения при объявлении этого типа таблицы (PRIMARY KEY, UNIQUE, CHECK), чтобы повысить производительность окончательного запроса:

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;

Не забудьте добавить ORDER BY пункт к вашему последнему запросу.

Недавно я использовал это решение для оптимизации представления (ViewA, DISTINCT + LEFT JOIN + GETDATE()), используемого другими представлениями (ViewB). В этом случае (ViewA) было невозможно создать индексированное представление (из-за DISTINCT + LEFT JOIN + GETDATE()). Вместо этого я создал TVF с несколькими утверждениями, который улучшил производительность за счет уменьшения логического чтения (в некоторых случаях радикально) окончательного запроса.

Примечание. Конечно, вы можете попробовать использовать индексное представление.

Другие вопросы по тегам