CTEを使用する主な理由は、row_number()
などのさまざまなウィンドウ関数にアクセスすることです。
つまり、グループごとに最初または最後の行を非常に迅速かつ効率的に取得できます。ほとんどの場合、他の手段よりも効率的です。
with reallyfastcte as (
select *,
row_number() over (partition by groupingcolumn order by sortingcolumn) as rownum
from sometable
)
select *
from reallyfastcte
where rownum = 1;
相関サブクエリを使用するか、サブクエリを使用して、上記と同様のクエリを実行できますが、ほとんどすべてのシナリオでCTEが高速になります。
さらに、CTEはコードの簡素化に非常に役立ちます。これにより、クエリをより深く理解し、オプティマイザをより選択的にするのに役立つビジネスロジックを導入できるため、パフォーマンスが向上します。
さらに、ビジネスロジックを理解し、クエリのどの部分を最初に実行する必要があるかを知っている場合、CTEはパフォーマンスを向上させることができoption(force order)
ます。ヒント
最後に、CTEはデフォルトでtempdbを使用しないため、CTEを使用することでそのボトルネックの競合を減らすことができます。
データを複数回クエリする必要がある場合、またはクエリを測定し、一時テーブルに挿入してインデックスを追加することでパフォーマンスが向上することを発見した場合は、一時テーブルを使用する必要があります。