SQL:SELF JOIN Vs RANK,在这种情况下哪个更快?

时间:2014-11-14 02:04:20

标签: sql sql-server performance join

我确信这是一个非常简单的SQL查询问题。这是一个表的模型,我试图使用timestamp列(As_Of)查询具有上次更新值的ID

ID      Value  As_of

1173    156    20090601

1173    173    20081201

1173    307    20080901

1173    305    20080601

127     209    20090301

127     103    20081201

127     113    20080901

127     113    20080601

1271    166    20090201

1271    172    20081201

1271    170    20080901

1271    180    20080601
...

我的结果应该是这样的

ID      Value    As_of

1173    156      20090601

127     209      20090301

1271    166      20090201

我应该用哪个选项来完成? SELF JOIN OR RANK()? 请向我推荐一些关于两种方法的表现的提示。哪个更快? 我听说SELF JOIN会降低查询的性能。

RANK():

SELECT ID, Value, As_Of, RANK() OVER(PARTITION BY ID ORDER BY As_of DESC) 'RNK'
FROM Table

and by filtering using the column having RANK value 1

自我加入:

SELECT ID, Value,As_of 
from Table a inner join 
          (SELECT ID, MAX(As_of) as As_of 
          from Table group by ID) b 
on a.ID=b.ID and a.As_of = b.As_of

3 个答案:

答案 0 :(得分:1)

您应该尝试在数据上使用这两种方法来查看哪种方法更快。我可能怀疑rank()方法会更快,因为它消除了明确的join,但没有像真正的测试那样可以肯定地说。

顺便说一下,你应该尝试第三种方法:

select id, value, as_of
from table t
where not exists (select 1 from table t2 where t2.id = t.id and t2.as_of > t.as_of);

有时,这种方法也可以有很好的表现。

答案 1 :(得分:0)

当您拥有大量数据时,交叉应用或加入效果会更好

Select t1.id, t1.value, t1.as_of
from table t
cross apply(Select top 1 * from table t1 where t.id = t1.id order by as_of desc)t1
where t.as_of = t1.as_of

答案 2 :(得分:0)

SELECT ID,VALUE,AS_OF 
    FROM Table T1 
    WHERE 1=(
          SELECT COUNT(*) 
          FROM Table T2 
          WHERE T1.ID=T2.ID AND T2.AS_OF>=T1.AS_OF
    )

这也可能有用..