子查询中带有或不带有 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)

在此处输入图片说明