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

标签 sql sql-server sql-server-2008-r2 sql-optimization sqlperformance

我无法找到正确的关键字来搜索此问题的答案,因此,如果已经得到答案,我深表歉意。

考虑以下 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

在这种情况下,您会得到与相关子查询类似的结果,如果未选择第 3 列,则该计划仅显示表 1 中的选择,因为它是一个 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;

从 table2 上出现Distinct Sort 以及删除Stream Aggregate 可以看出。

总而言之,这取决于情况。

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

相关文章:

SQL 服务器 : delete where string value contains another value

php - 使用数组创建 SQL 表

mysql - 如何改进键表和另一个表之间的 JOIN 操作

sql-server - 通信链路故障错误信息

sql-server - 在 SQL Server 配置管理器中启用了 TCP/IP 的 Microsoft SQL Server 2008 R2

sql - 如何将xml保存到mysql数据库?

sql - 无法将数据保存到 SQL Server 数据库

mysql - SQL 错误 1452 : Cannot add or update child

sql-server - 如何找出哪个SQLDependency触发了更改函数?

sql-server-2008-r2 - 哪些表正在使用更改跟踪