17

集計関数を使用してクエリを作成するには、次の2つの方法があります。

select team, count(min) as min_count
from table
group by team
having count(min) > 500

また

select * 
from (
    select team, count(min) as min_count
    from table
    group by team
) as A
where A.min_count > 500

どちらのアプローチにもパフォーマンス上の利点はありますか、それとも機能的に同じですか?

4

1 に答える 1

12

2つのバージョンは機能的に同じです。ええと、2番目は構文的に正しくありませんが、私はあなたが意味すると思います:

select * 
from (
    select team, count(min) as count
    from table
    group by team
) t
where count > 500

(計算にはエイリアスが必要であり、いくつかの主要なデータベースでは、FROM句のサブクエリにエイリアスが必要です。)

機能的に同等であるということは、それらが必ずしも同じ方法で最適化されることを意味するわけではありません。機能的に同等のクエリを作成するには、多くの場合、複数の方法があります。ただし、特定のデータベースエンジン/オプティマイザーは、さまざまな最適化パスを選択できます(多くの場合、選択します)。

この場合、クエリは非常に単純であるため、複数の最適化パスを考えるのは困難です。どちらのバージョンでも、エンジンは基本的にクエリを集約してから、フィルターの2番目の列をテストする必要があります。私は個人的にこのテーマの多くのバリエーションを見ることができません。適切なSQLエンジンは、必要に応じて、両方の場合またはどちらの場合でもインデックスを使用する必要があります。

したがって、この特定の質問に対する答えは、合理的なデータベースでは、これらは同じ実行プランになるはずです(つまり、インデックスの使用、並列処理のユーザー、および集約アルゴリズムの選択)。ただし、機能的に同等であるということは、特定のデータベースエンジンが同じ実行計画を作成することを意味するわけではありません。したがって、一般的な答えは「いいえ」です。

于 2012-10-17T22:06:14.283 に答える