1

SQL-server逻辑查询阶段而言;WHERE子句在子句之后FROM

我使用了以下代码:

GO
SET showplan_ALL ON;
GO
SELECT  j.Name, 
        q.hoursWorked
FROM    #j j
        INNER JOIN #q q ON
          j.Name = q.Name
WHERE   q.hoursWorked > 9;
GO
SET showplan_ALL OFF;
GO

这导致以下结果:

在此处输入图像描述

现在WHERE似乎是嵌套循环的一部分。我认为嵌套循环是连接 - 这是FROM子句。

这与WHERE似乎与FROM物理计划相同的逻辑查询阶段有何一致?

4

2 回答 2

1

优化器将在查询中尽可能地向下推谓词。

在这种情况下,WHERE子句条件是针对单个表的条件 - 它可以避免从中检索任何q永远不会满足WHERE子句条件的行,因此根本不需要JOIN它们。

在 SQL 中,您描述的是您想要什么,而不是如何去做,优化器会尝试做出明智的决定。

如果逻辑查询阶段也是物理阶段,则不会如此命名。优化器必须像遵循逻辑顺序一样产生结果,但如果这样做更有效,则可以选择以不同的顺序执行操作。

于 2013-08-27T07:02:58.327 回答
1

查询优化器可以选择任何物理执行计划,只要结果与查询相对应。因此,它可以以它认为合适的任何方式执行条件、连接和投影。

如果您需要以特定顺序执行查询部分,则需要使用临时表和/或查询提示。否则,您不得对执行顺序做出任何假设。

于 2013-08-27T07:03:20.050 回答