我必须使用以下技术来实现我的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;
最近,我使用此解决方案来优化另一个视图(ViewB)使用的视图(ViewA,DISTINCT LEFT JOIN GETDATE()).在这种情况下(ViewA)无法创建索引视图(因为DISTINCT LEFT JOIN GETDATE()).相反,我创建了一个多语句TVF,它通过减少最终查询的逻辑读取(在某些情况下显着)来提高性能.
注意:当然,您可以尝试使用index view.