11

次の2つのクエリの間にパフォーマンスの違いはありますか?もしそうなら、どちらが優れていますか?:

    select 
    q.id, 
    q.name 
    from(
        select id, name, row_number over (partition by name order by id desc) as row_num
from table
    ) q
        where q.row_num = 1

select
max(id) ,
name
from table
group by name

(結果セットは同じである必要があります)

これは、インデックスが設定されていないことを前提としています。

更新:私はこれをテストしました、そしてそれgroup byはより速かったです。

4

3 に答える 3

5

グループ化はより高速になるはずです。行番号は、テーブル内のすべての行に行を割り当てる必要があります。不要なものを除外する前にこれを行います。

2 番目のクエリは、はるかに優れた構造です。最初に、パーティション句の列が必要な列と一致していることを確認する必要があります。さらに重要なことに、"group by" は SQL ではよく理解されている構造です。また、group by の方がインデックスをより有効に利用できるのではないかと推測しますが、それは推測です。

于 2012-06-27T19:05:29.120 に答える
2

を使用しgroup by nameます。

name, id DESCインデックスが(プラン 1 )の場合、それほど多くはありません

name, id ASCしかし、インデックスが( Plan 2 )として宣言されている場合、2008 年にROW_NUMBERバージョンがこのインデックスを使用できず、並べ替え操作を取得するのに対し、GROUP BY逆方向のインデックス スキャンを使用してこれを回避できることがわかります。

SQL Server のバージョンの計画と、データとインデックスを確認する必要があります。

于 2012-06-27T19:03:30.910 に答える