SQL Server是否执行CTE表达式(如果未使用)?

问题描述:

我正在尝试调试执行速度很慢的查询。它有几个with表达式,它们是left joined。当我删除连接时,它会显着加速。SQL Server是否执行CTE表达式(如果未使用)?

原始查询:

;with CTE as 
(
    Select * 
    from table1 
) 
SELECT * 
FROM table2 
LEFT JOIN CTE ON table2.CTEID 

性能更好的查询:

;with CTE as 
(
    Select * 
    from table1 
) 
SELECT * 
FROM table2 

在上文中,它不执行CTE,因为它没有加入,或者不管它执行什么?

+0

实际查询如何?除了一句话之外,我们无法提供很多帮助。 “with”是您如何定义公用表格表达式。这不是一个变量。 –

+0

我想这就是我困惑的地方。当你使用它时,它实际上在表达式内部执行查询,还是在调用它时执行查询? –

+0

这是一个内联视图,它不被调用。它是查询的一部分。 –

我的猜测可能不是 - 查询优化器是非常聪明的关于不执行不必要的东西。每个查询都是不同的,查询优化器使用有关您实际数据的统计信息来决定如何评估它,因此唯一可以确定的方法是让SQL Server告诉您它如何评估您的查询。

要做到这一点,请在SQL Server Management Studio中使用“包括实际执行计划”执行查询,并且您将清楚地看到它如何评估查询。

+0

谢谢,我没有想到执行计划。你是对的。 Contra Sean评论说它没有执行CTE。 –

+1

嗯,我想定义一个cte而不使用它将是完全荒谬的,但它会有道理,它不会选择数据,因为它从来没有被选中。 –

+0

很好,我想了解它是CTE还是导致瓶颈的加入。虽然我现在知道这是我个人案例的加入(运行CTE的内容表现良好),但我想更好地理解发生了什么。 –