Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server T-sqlcte的性能特点_Sql Server_Performance_Tsql_Query Optimization - Fatal编程技术网

Sql server T-sqlcte的性能特点

Sql server T-sqlcte的性能特点,sql-server,performance,tsql,query-optimization,Sql Server,Performance,Tsql,Query Optimization,我有一些SQL,大致如下所示: with InterestingObjects(ObjectID, OtherInformation, Whatever) as ( select X.ObjectID, Y.OtherInformation, Z.Whatever from X join Y join Z -- abbreviated for brevity ) -- ...long query follows, which uses InterestingObjects in

我有一些SQL,大致如下所示:

with InterestingObjects(ObjectID, OtherInformation, Whatever) as (
    select X.ObjectID, Y.OtherInformation, Z.Whatever
    from X join Y join Z -- abbreviated for brevity
)

-- ...long query follows, which uses InterestingObjects in several more CTEs,
-- and then uses those CTEs in a select statement at the end.
当我运行它时,我可以在执行计划中看到,它似乎基本上每次引用CTE时都在CTE中运行查询。如果我改为创建一个临时表#InterestingObjects并使用它,当然,它会运行一次查询,将结果放入临时表,然后再查询。在我的例子中,这使得整个过程运行得更快

我的问题是:这是否总是我从CTE中所期望的(不以任何方式记录结果,就像它在任何地方内联查询一样?)?通常,我对优化器的智能感到敬畏,但我很惊讶它竟然不能解决这个问题


(编辑:顺便说一句,我是在SQL Server'08 R2上运行的。)

CTE的好坏取决于它们的使用方式(涉及递归、索引等概念)。您可能会发现这篇文章很有趣:

Stackoverflow用户Quassnoi就此写了一篇有趣的文章。这很有趣。我没有像他描述的那样在任何约束条件下操作(例如,通过一个不允许临时表的ORM),所以我真的不明白为什么他的方法比临时表更好——显然,如果你硬编码这样的计划,当你改变查询时,会有很大的维护成本。不过,对于执行计划如何控制这种行为,这是一个非常有用的视图。