SQL Server组由子查询替代

时间:2016-11-16 13:52:38

标签: sql sql-server query-optimization

你们中的任何人都可以指导我,哪个查询执行得更快?

第一次查询:

Select 
    t1.*, t2.CountDuplicate 
From 
    Table1 t1
Inner Join 
    (Select 
         ID, Name, Count(*) as CountDuplicate 
     From 
         Table1 
     Group By 
         ID, Name) t2 on t2.Id = t1.Id

第二次查询:

Select 
    t1.*, 
    (Select Count(t2.*) 
     From Table1 t2 
     Where t2.Id = t1.Id 
     Group By t2.ID, t2.Name) as CountDuplicate 
From 
    Table1 t1

2 个答案:

答案 0 :(得分:0)

The First Query will run Faster

<强>原因:

  1. 第一个查询将分别执行两个查询only once并将它们的结果集连接在一起以获得最终结果集,这是一个很好的基于干净集的方法。

  2. 另一方面,在第二个查询中,外部查询将执行一次,但内部查询将针对外部查询返回的每一行执行,例如,如果外部查询返回1000行,则内部查询将是执行了1000次。

  3. 坚持选择One。

答案 1 :(得分:0)

指定第二个查询的正确方法是:

Select t1.*, 
       (Select Count(*) 
        From Table1 t2
        where t2.Id = t1.Id 
       ) as CountDuplicate 
From Table1 t1;

我不知道为什么name中有group by。在条件中您可能需要and t2.name = t1.name

子查询中不需要group by

哪种方法更快,取决于许多因素。要使此版本具有性能,您需要table1(id)上的索引。但是,编写此查询的最佳方法是:

select t1.*, count(*) over (partition by id) as CountDuplicate
from table1 t1;

这应该是最好的表现。