如前所述,这取决于您的 DBMS(版本和提供者),以确定检查执行计划。这显示了 SQL-Server 2008 的子查询未执行:
正如您在Column3
未选择的顶部计划中看到的那样,该计划只是从 table1 中选择,在包含的底部计划中Column3
,查询 table2。
在 SQL-Server 2008 R2中它不被执行。
在 SQL-Server 2012中不执行;
在 MySQL中它被执行,并且两个查询生成相同的计划:
进一步详细说明,它还取决于您的确切查询以及您的 DBMS。例如:
CREATE VIEW View2
AS
SELECT t.ID, t.Column1, t.Column2, t2.Column3
FROM Table1 t
LEFT JOIN
( SELECT ID, Column3 = SUM(Column3)
FROM Table2
GROUP BY ID
) t2
ON t2.ID = t.ID
GO
SELECT Column1, Column2
FROM View2;
SELECT Column1, Column2, Column3
FROM View2;
在这种情况下,您会得到与相关子查询相似的结果,如果未选择 column3,则计划仅显示从 table1 中选择,因为LEFT JOIN
优化器知道子查询t2
与从 table1 中选择无关,并且没有使用列所以它不会打扰它。如果您将 LEFT JOIN 更改为 INNER JOIN,例如
CREATE VIEW View3
AS
SELECT t.ID, t.Column1, t.Column2, t2.Column3
FROM Table1 t
INNER JOIN
( SELECT ID, Column3 = SUM(Column3)
FROM Table2
GROUP BY ID
) t2
ON t2.ID = t.ID
GO
SELECT Column1, Column2
FROM View3;
SELECT Column1, Column2, Column3
FROM View3;
这两个查询的查询计划表明,由于第二个查询中没有使用聚合列,优化器本质上将视图更改为:
SELECT t.ID, t.Column1, t.Column2
FROM Table1 t
INNER JOIN
( SELECT DISTINCT ID
FROM Table2
) t2
ON t2.ID = t.ID;
Distinct Sort
从table2的外观和Stream Aggregate
.
所以总而言之,这取决于。