子查询中带有或不带有 DISTINCT 的 UNION 查询是否等效?

Sco*_*t M 0 sql-server union distinct

考虑以下两个查询。

SELECT Col1, Col2
FROM TblA

UNION

SELECT Col1, Col2
FROM TblB
Run Code Online (Sandbox Code Playgroud)

SELECT DISTINCT Col1, Col2
FROM TblA

UNION

SELECT DISTINCT Col1, Col2
FROM TblB
Run Code Online (Sandbox Code Playgroud)

这些在逻辑上是等价的。我的问题是数据库引擎是否对它们进行了相同的处理。SQL Server 是否识别冗余并忽略DISTINCT运算符?

Geo*_*son 5

不,它们不一定“被数据库引擎同等对待”。下面的测试表明您可能会得到不同的查询计划。

在许多情况下,查询计划之间的差异对您来说可能无关紧要。但在某些(可能很少见)的情况下,这可能很重要。例如,如果 SQL Server 对 UNION 的一个分支的基数估计非常差,则计算该分支内的唯一行可能会导致溢出,如果查询仅计算最后一组唯一行,则不会发生这种情况。

SELECT @@version
-- Microsoft SQL Server 2017 (RTM-CU1) (KB4038634) - 14.0.3006.16 (X64) 

SELECT create_date FROM sys.databases
UNION 
SELECT create_date FROM sys.databases

SELECT DISTINCT create_date FROM sys.databases
UNION 
SELECT DISTINCT create_date FROM sys.databases
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明