3

何が最善なのか、または違いがあるのか​​ を判断するのに苦労していますが、これを理解するのに役立つ資料が見つからないので、私ではない場合は、この質問をします。同じ状況に陥ります。

join の前後にサブクエリを集約すると、私の特定の状況では、断片化されたデータと不適切な正規化手順のためにサブクエリがかなり遅くなります。

非常に複雑なメインクエリと、ユニオンを使用して結合された3つの小さなクエリから構築されたサブクエリを取得しました(重複レコードを削除します)。このサブクエリから(行ごとに)単一の値のみが必要なので、ある時点で、この値を合計することになります(必要な制御データをグループ化して、結合できるようにします)

何が最も大きな影響を与えるでしょうか?

  • 結合前にサブクエリを合計してから、集計されたバージョンと結合するには
  • データを生のままにして、残りのメインクエリと一緒に値を合計するには

行ごとに合計される数千のレコードがあり、データはネイティブではなく構築されているため、メモリに存在する可能性があることを覚えておいてください (これは、クエリオプティマイザーの観点からの推測にすぎません)。

4

2 に答える 2

3

通常、group-byはサブクエリ内に保持します(Oracle用語では「インラインビュー」と呼ばれます)。このようにして、クエリははるかに単純で明確になります。また、集約されるデータセットが小さくなり、結果として得られる結合キーのセットも小さくなるため、実行プランの方が効率的だと思います。

しかし、これは決定的な答えではありません。インラインビューに結合している行ソースに一致する行がほとんどない場合は、早期結合によって集計の労力が軽減されることがあります。

正しい答えは次のとおりです。特定のデータセットのクエリをベンチマークします。

于 2012-12-11T09:04:39.553 に答える
1

私はそのような一般的な方法でそれを行う正しい方法も間違った方法もないと思います。説明するようなクエリのパフォーマンスは、さまざまな要因によって異なります。

  • 実際にどのような種類の結合を行っていますか(およびバックグラウンドでどのアルゴリズムが使用されていますか)
  • 結合されるデータは、結合するマシンのメモリに収まるほど小さいですか?
  • どのクエリ最適化を使用していますか、つまりどのDBMS(Oracle、MsSQL、MySQLなど)を使用していますか
  • ..。

あなたの場合、私は単にベンチマークを提案します。それが満足のいく答えではないように思われる場合は申し訳ありませんが、それは多くのパフォーマンスの質問に答える方法です...

したがって、アプローチといくつかのテストデータの両方を使用して簡単なテストを設定し、より高速なものを選択します。

于 2012-12-11T09:04:27.413 に答える