TSQL——优化器如何处理与未使用表的连接
TSQL -- how does optimizer deal with joins with unused tables
TSQL -- 优化器如何处理未使用的连接 tables
SELECT table1.col1, table2.col1, table2.col2 -- etc.
FROM dbo.table1
LEFT JOIN dbo.table2
on (table1.id = table2.id)
LEFT JOIN dbo.table3
on (table1.id = table3.id)
在上面的简单示例中,显然不需要 table 3,但可能存在更复杂的情况。
问题: TSQL 查询优化器是否能够确定不需要与 table 3 的 JOIN?如果是这样,如果未从查询中手动删除 table3,它是否会错过针对更复杂查询的其他优化?
我将 SSMS 14.017 与 select 的基础 SQL 数据库一起使用 @@version = Microsoft SQL Server 2014 (SP3)
是的,查询优化器可以跳过 table3,因为它没有在 SELECT 列表中被引用并且连接条件是 LEFT OUTER JOIN
所以没有过滤。
相关:10 Cool SQL Optimisations That do not Depend on the Cost Model by Lukas Eder:
- 不需要Table 访问
- 加入消除
JOIN Elimination: An Essential Optimiser Feature for Advanced SQL Usage
TSQL -- 优化器如何处理未使用的连接 tables
SELECT table1.col1, table2.col1, table2.col2 -- etc.
FROM dbo.table1
LEFT JOIN dbo.table2
on (table1.id = table2.id)
LEFT JOIN dbo.table3
on (table1.id = table3.id)
在上面的简单示例中,显然不需要 table 3,但可能存在更复杂的情况。
问题: TSQL 查询优化器是否能够确定不需要与 table 3 的 JOIN?如果是这样,如果未从查询中手动删除 table3,它是否会错过针对更复杂查询的其他优化?
我将 SSMS 14.017 与 select 的基础 SQL 数据库一起使用 @@version = Microsoft SQL Server 2014 (SP3)
是的,查询优化器可以跳过 table3,因为它没有在 SELECT 列表中被引用并且连接条件是 LEFT OUTER JOIN
所以没有过滤。
相关:10 Cool SQL Optimisations That do not Depend on the Cost Model by Lukas Eder:
- 不需要Table 访问
- 加入消除
JOIN Elimination: An Essential Optimiser Feature for Advanced SQL Usage