我有一个包含许多左外连接的复杂查询。
如果我接受该查询
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的性能比选择计数要好得多,我希望我的选择计数也可以执行。
由于
答案 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)
是一件好事。