0

Oracle 11g を使用しています。

1016736 行の大きなテーブルと、2007 行の別の小さなテーブルがあります。これら 2 つのテーブルをビューに結合したいと考えています。

以下のようにこれらのテーブルを結合します。

ここで、big_table.id = small_table.id (+)

これは、小さなテーブルを 1016736 回見ることでビューを形成すると思います。これを行うためのより最適化された方法はありますか?

現在の方法ではクエリが遅くなっているため、高速化したいと考えています。

私はオラクルが初めてなので、どんなアイデアでも大歓迎です。

--- 編集 --- これは私の見解のスクリプトです。

select a.col1, a.col2, a.col100, b.col1, b.col2, b.col3 
from big_table a, small_table b where a.col1 = b.col1 (+)
4

2 に答える 2

2

どちらのテーブルにも述語を配置せずにビューから選択する場合、Oracle は、個別の値の数、結合列の最大値と最小値、および存在するヒストグラムに基づいて、結合カーディナリティを推定します。射影される行数は、0 から 1016736 x 2007 までの範囲である可能性があります (結合列のそれぞれが、すべての行に対して同じ単一の値を持つ場合)

結合タイプは、この推定に依存します。

通常、このタイプのクエリにはハッシュ外部結合が表示されます。これは非常に効率的であり、クエリ プロジェクションで必要なデータを読み取るよりもコストがほとんどかかりません。

単純なカウント (*) の場合、結合列にインデックスがあり、大きなテーブルの結合列が NOT NULL に制限されている場合 (または何らかの方法を使用して、NULL 値がインデックスに含まれていることを確認している場合)、それらはそれぞれ次のようになります。高速で完全にスキャンされ、結果のハッシュが外部結合されます。パフォーマンスは非常に優れています。

遅い特定のクエリがある場合は、最適化に役立つ実行計画が必要です。

于 2013-10-16T21:03:24.947 に答える
0

結合はOKです。各テーブルの「Id」にインデックスを作成するだけです。

統計を更新してみてください。

各テーブルについて:

ANALYZE TABLE XXXX_TABLE DELETE STATISTICS;

ANALYZE TABLE XXXX_TABLE COMPUTE STATISTICS;
于 2013-10-16T20:47:50.523 に答える