考虑以下两个查询。
SELECT Col1, Col2
FROM TblA
UNION
SELECT Col1, Col2
FROM TblB
和
SELECT DISTINCT Col1, Col2
FROM TblA
UNION
SELECT DISTINCT Col1, Col2
FROM TblB
这些在逻辑上是等价的。我的问题是数据库引擎是否对它们一视同仁。SQL Server 是否识别冗余并忽略DISTINCT
运算符?
考虑以下两个查询。
SELECT Col1, Col2
FROM TblA
UNION
SELECT Col1, Col2
FROM TblB
和
SELECT DISTINCT Col1, Col2
FROM TblA
UNION
SELECT DISTINCT Col1, Col2
FROM TblB
这些在逻辑上是等价的。我的问题是数据库引擎是否对它们一视同仁。SQL Server 是否识别冗余并忽略DISTINCT
运算符?
不,它们不一定“被数据库引擎同等对待”。下面的测试表明您可能会得到不同的查询计划。
在许多情况下,查询计划之间的差异对您来说可能无关紧要。但在某些(可能很少见的)情况下,它可能会很重要。例如,如果 SQL Server 对 UNION 的一个分支的基数估计非常差,则计算该分支内的唯一行可能会导致溢出,如果查询仅计算最后一组唯一行,则不会发生这种情况。