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运算符?
不,它们不一定“被数据库引擎同等对待”。下面的测试表明您可能会得到不同的查询计划。
在许多情况下,查询计划之间的差异对您来说可能无关紧要。但在某些(可能很少见)的情况下,这可能很重要。例如,如果 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)