6

Over Partition ByGroup Byの違いについて、すでに2つの質問がSOに掲載されていますが、どちらが優れているかについての決定的な結論は見つかりませんでした。オーバーパーティションとグループの間のSQL Serverパフォーマンスの比較

私はsimple scenario at SqlFiddleを設定しました。ここでOver (Partition By)はより良い実行計画を誇っています(しかし、私はあまりよく知らない)。

テーブル内のデータ量がこれを変更する必要がありますか? Over (Partition By)は最終的に性能が向上しますか?

enter image description here

enter image description here

+0

私はあなたが何を得ているのか分かりません。もちろん、 'by by by by group by 'と' group by'の間には類似点がありますが、ユースケースの異なる2つの異なる操作です。なぜ、第二の実行計画がより良くなると考えていますか?両方とも同じクラスタード・インデックス・スキャンを実行する必要がありますが、2番目のクラスターは比較的時間がかかりませんので、明らかに全体的に長くなります。 – Luaan

+2

誰かが他より優れたパフォーマンスを発揮するという普遍的なルールはありません。パフォーマンス*目標*を設定して、手元の問題を解決する簡単なコードを記述します。その後、パフォーマンスを測定します。パフォーマンスが許容できない場合にのみ、変更を検討する必要があります。しかし、クエリが*正しい*ならば、それはもっと可能性が高い。インデックスはこれらの2つの間で変化するよりも変化する必要があります。 (もし*が普遍的に他のものよりも優れていれば、2つの方法の間で機械的にクエリを変換することが可能だったならば、オプティマイザはすでにそれを実行していたでしょう) –

+0

@Luaan:私の観点から見ると、何かをして同じ結果を得ると、それはすべて沸騰します。ある方法は他の方法よりも優れた性能を発揮しますか?もしそうでなければ、私はより一般的なGroup Byの方法に固執するでしょう。同僚が** over **と選択された選択肢を提供しました。私は今これについて学んでいます。 – Veverke

答えて

2

ウィンドウ関数の実行計画は明らかに(実行計画により、グループ全体がウィンドウ関数実行の右上に含まれていることにより、グループの実行計画に劣っています計画)。一般的に、SQLはover節を使用するよりもgroup byに最適化されていますが、それぞれには用途があります。たとえば、グループの合計で各エントリの行を出力する場合は、ウィンドウ処理が適切になるでしょう(例:A.id|B.b1|sum B.b1 over A.id)。あなたがしないので、それは本当にしません。あなたは基本的にグループを使っていますし、グループを暗示するだけではなく、別のものをもう一度取っています。

+0

あなたは*一般的にSQLはグループ以上に最適化されていますか?私はあなたがここでの実行計画が*明らかに劣っていると言っています*。 – Veverke

+0

一般的に、SQLはグループに対してより最適化されています。これは、overには追加情報が含まれているためです(したがってdistinct句が必要です)。クエリの効率的な集約バージョンを構築することが難しい場合は、実際にウィンドウ関数を使用するだけです。 –

+0

ああ、あなたが*劣っていると言ったら、それは悪化していますか?私はあなたが劣っていることを示す*劣った*を使用していたと思ったので、それはより良いです... – Veverke

関連する問題