いくつかのテーブルがあり、ほとんどのクエリはほんの数個の結合を使用します。つまり、ほとんどすべてのクエリが使用する2〜3個の結合のようなものがあります。テーブルが大きくなっている場合に、この一般的な結合を高速化する最も一般的な方法は何ですか?SQLServerまたはOracleを使用したいと思います。
3 に答える
マテリアライズドビュー-オラクルはこれらをサポートしており、場合によっては特に便利です。書き込みではなく読み取りが多い場合:http: //docs.oracle.com/cd/B10501_01/server.920/a96520/mv.htm
インデックス-クエリプランを分析/説明し、インデックスの追加が役立つかどうかを確認します。多くの場合、クエリごとに異なるインデックスを使用することで、速度を向上させることができます。特定のクエリに使用するインデックスをクエリパーサーに指示するためのヒントを提供することもできます。
非正規化-これらのテーブルのデータの一部を、データを取得するために結合するのではなく、関連するテーブルに格納します。
キャッシング-クエリキャッシュのサイズを増やすか、アプリにキャッシングレイヤーを作成します。
いくつかのオプション
- 参加する列にインデックスを配置します
- 必要なデータをカバーするようにインデックスを作成します
- データを非正規化して、結合は必要ありません<=最大の勝利
- SQLServerのインデックス付きビューまたはOracleのマテリアライズドビューを使用する
- クエリオプティマイザが取得できる最高の統計を提供して、最適な結合戦略(ハッシュ/マージ/ループ)を使用するようにしてください。
最も一般的な方法はインデックス作成ですが、より具体的にするための十分な情報を提供していません。
いくつかのシナリオを次に示します。
(1)ファクトテーブルなどの中央テーブルに接続された一連の参照テーブルがあります。
この場合、参照テーブルに自動インクリメントの主キーを定義する必要があります。これは自動的にインデックスとして機能します。
(2)クエリは非常に選択的です
この場合、where句のフィールドにインデックスを集中させる必要があります。これは、2番目のテーブルが非常に小さい場合に特に当てはまります。したがって、順次検索はインデックス検索に似ています。
(3)結合されたテーブルは実際にはパフォーマンスのボトルネックです
この場合、テーブルまたはインスタンス化されたビューのいずれかとして、結合の結果をインスタンス化することができます。これは、結合基準でデータ範囲を使用するなど、結合基準が複雑な場合に必要になる可能性があります。
(4)データのパーティション化など、他のオプションもあります。