gpt4 book ai didi

sql - 是否执行了 SQL View 中未选择的列?

转载 作者:行者123 更新时间:2023-12-04 04:53:16 24 4
gpt4 key购买 nike

我无法想出正确的关键字来搜索这个问题的答案,所以如果已经回答了,我深表歉意。

考虑以下 SQL View :

CREATE VIEW View1 AS
SELECT Column1
,Column2
,(SELECT SUM(Column3) FROM Table2 WHERE Table2.ID = Table1.ID) -- Subquery
FROM Table1

如果我运行以下查询,会执行子查询还是 SQL Server 优化查询?
SELECT Column1 FROM View1

我是从性能的角度来看这个的,比如说,如果 View 有很多子查询(如果内部选择引用一个大表,聚合可能需要很长时间)。

我正在使用 SQL Server 2008 R2,但我很想知道 2012 或 MySQL 的答案是否有所不同。

谢谢。

最佳答案

如前所述,这取决于您的 DBMS(版本和提供者),要确定检查执行计划。这表明 SQL-Server 2008 没有执行子查询:

enter image description here

正如您在顶部平面图中看到的那样 Column3未选择该计划只是从 table1 中选择,在包含 Column3 的底部计划中, table2 被查询。

In SQL-Server 2008 R2它没有被执行。

In SQL-Server 2012它没有被执行;

In MySQL它被执行,并且两个查询生成相同的计划:

enter image description here

进一步详细说明,它还取决于您的确切查询以及您的 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;

enter image description here

在这种情况下,您将获得与相关子查询相似的结果,如果未选择 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;

enter image description here

这两个查询的查询计划显示,因为在第二个查询中没有使用聚合列,优化器本质上将 View 更改为:
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 .

所以总而言之,这取决于。

关于sql - 是否执行了 SQL View 中未选择的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17107235/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com