sql-server - T-SQL CTE 的性能特征

标签 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 several more CTEs,
-- and then uses those CTEs in a select statement at the end.

当我运行它时,我可以在执行计划中看到,基本上每次引用 CTE 时,它似乎都在 CTE 中运行查询。如果我创建一个临时表 #InterestingObjects 并使用它,当然,它会运行一次查询,将结果放入临时表中,然后再进行查询。在我的特定实例中,这使得整个过程运行得更快。

我的问题是:这是否总是我对 CTE 的期望(不以任何方式内存结果,就像它在各处内联查询一样?)是否有 SQL Server 无法更好地优化这一点的原因?通常我对优化器的智能感到敬畏,但令我惊讶的是它无法解决这个问题。

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

最佳答案

CTE 可能更好也可能更差,仅取决于它们的使用方式(涉及递归、索引等概念)。您可能会发现这篇文章很有趣:http://www.sqlservercentral.com/articles/T-SQL/2926/

关于sql-server - T-SQL CTE 的性能特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3336100/

相关文章:

c# - 使用 C# 自动执行 SQL Server 备份

sql - 如何计算t-sql中两个日期之间的闰年数?

sql-server - Microsoft SQL Server 2008 中 JOIN 与 APPLY 的相对效率

sql - 我的用例能否在不影响性能的情况下合并到单个查询中?

sql - 在 SQL Server 2008 中使用 PIVOT

sql-server - 用前一行更新记录

.net - .NET生产代码概要分析工具

MySQL SELECT 查询字符串中包含的字段值

sql-server - 删除表中的行会导致 LOCKS

mysql - PK 和 MySQL 中另一个字段的表更新偶尔会很慢