我必须使用以下技术来实现我的 CTE 并提高视图性能:
WITH CTE AS(
SELECT TOP 100 PERCENT
ORDER BY ...
)
WITH CTE AS(
SELECT TOP 2147483647
ORDER BY ...
)
现在,这两种方式都不起作用。有没有人面临同样的问题或知道在 SQL Server 2012 中这些东西是否无效?
我必须使用以下技术来实现我的 CTE 并提高视图性能:
WITH CTE AS(
SELECT TOP 100 PERCENT
ORDER BY ...
)
WITH CTE AS(
SELECT TOP 2147483647
ORDER BY ...
)
现在,这两种方式都不起作用。有没有人面临同样的问题或知道在 SQL Server 2012 中这些东西是否无效?
您可以尝试使用多步表值函数。这样,服务器被迫将 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
子句添加到最终查询中。
最近,我使用这个解决方案来优化另一个视图 (ViewB) 使用的视图 (ViewA, DISTINCT + LEFT JOIN + GETDATE())。在这种情况下(ViewA)不可能创建索引视图(因为 DISTINCT + LEFT JOIN + GETDATE())。相反,我创建了一个多语句 TVF,它通过减少最终查询的逻辑读取(在某些情况下急剧增加)来提高性能。
注意:当然,您可以尝试使用索引视图。