2010-06-24 50 views
1

考虑下面的SQL(SQL Server 2008中)声明:WITH语句如何存储select查询的记录集?

WITH MyResult AS 
(
    SELECT 
    Name, 
    Row_ID AS ORD 
    FROM Person Where Gender = @Gender 
) 
SELECT * 
FROM MyResult 
WHERE ORD > 5 

是MyResult存储在一个临时表在tempdb?还是它做了别的事情?

我们优化一些查询,并会艾克以更好地与语句(内部)了解,以帮助计性能等

感谢

回答

2

没有,按this MSDN article

...的CTE是一种语言级别的 构造 - 意思是SQL Server不会 内部创建临时或虚拟 表...

并且还as mentioned here

公共表表达式(CTE)可以是作为临时结果集 即一个SELECT,INSERT, UPDATE的执行 范围内定义 思想,DELETE或CREATE VIEW 声明。 CTE类似于 派生表,因为它不作为对象存储 ,并且仅持续查询的持续时间为 。

+0

“...一个临时结果集......”引发了我们认为临时结果集临时存储在某处的想法(即tempdb) – Russell 2010-06-24 09:18:11

+0

@Russell - 是的,我可以看到措辞有点混浊在这。本身使用CTE时,SQL Server不会创建临时表。当然,就像任何查询,CTE或者没有CTE一样,它可以根据发生的情况分页到tempdb。但这不是特定于CTE的 – AdaTheDev 2010-06-24 09:21:47