2010-05-18 60 views

回答

3

除非使用递归功能,否则CTE在性能方面并不比简单的内联视图更好。

它只是为您节省一些打字。

优化程序可以自由决定是否重新评估与否,当它被重用,这决定它大多数情况下,重新评估:

WITH q (uuid) AS 
     (
     SELECT NEWID() 
     ) 
SELECT * 
FROM q 
UNION ALL 
SELECT * 
FROM q 

将返回两个不同NEWIDs

请注意,其他引擎可能会有不同的行为。与SQL Server不同,实现CTEs

Oracle支持一个特殊的提示/*+ MATERIALIZE */,告诉优化器是否应该实现CTE

5

我不能完全肯定的性能优势,但我认为它可以在一定的情况下帮助地方使用子查询的结果该子查询被执行多次。

除此之外,它确实可以使代码更具可读性,并且还可以用于多个子查询将在不同位置剪切和粘贴相同代码的情况。

使用前应该知道什么? 一个很大的缺点是,当你在一个视图中有一个CTE时,你不能在该视图上创建一个聚集索引。这可能是一个很大的麻烦,因为SQL Server没有物化视图,而且之前肯定会咬我。

+1

无法接受两个答案,但谢谢:) – hgulyan 2010-05-19 10:47:36

0

with是SQL中的一个关键字,它将临时结果存储在临时表中。例如:

with a(--here a is the temporary table) 
(id)(--id acts as colomn for table a) 
as(select colomn_name from table_name) 

select * from a