Microsoft SQL Server查询根据select distinct vs select count

时间:2016-12-06 21:43:52

标签: sql-server select left-join sql-server-2014

我有一个包含许多左外连接的复杂查询。

如果我接受该查询

select distinct top X [table1].[column1] 
from .... 

带有几个带过滤器的表,并查看与以下内容完全不同的查询计划:

select count(distinct [table1].column1) 
from ....

我注意到,我的语句中的所有左连接都是由where子句或select子句中的过滤器所不需要的,优化器会删除select distinct top但不适用于select count语句。

我使用Microsoft SQL Server 2014作为我的引擎。

我想知道select distinct是如何删除连接的,并且是我可以为我的选择计数提供的查询提示。

由于显而易见的原因,select distinct的性能比选择计数要好得多,我希望我的选择计数也可以执行。

由于

1 个答案:

答案 0 :(得分:0)

如果您有left join但没有where子句,则第一个表中的所有行都保留在结果集中。它们可能会重复,具体取决于连接的内容,但 distinct 值的数量与:

相同
select count(distinct [table1].column1)
from table1;

我想这可以概括为包含where子句和所需的连接。

理论上,如果没有count(),这也是一样的。 。 。假设所有列都来自第一个表:

select distinct [table1].column1
from table1;

我很惊讶SQL Server完全认识到这种优化。我认为即使不在其他情况下,它也能识别count(distinct)是一件好事。