1

Oracle10g64ビットRedHatEnterprise Linux564ビット

現在、正規化されたサードパーティのデータベースにアクセスできます。これらには膨大な量のデータがあり、私の要件は、多くのテーブルを結合してマテリアライズドビューを公開することです。

表1:Example_Master列:MasterID(VARCHAR2(250))MasterName(VARCHAR2(250))行:9千万主キー:MasterID

表2:Example_ChildA1列:ChildA1ID(VARCHAR2(250))MasterID(VARCHAR2(250))行:2500万

表3:Example_ChildA1ID列:ChildA1ID(VARCHAR2(250))ChildA1Name(VARCHAR2(250))主キー:ChildA1ID

表4:Example_ChildA2列:ChildA2ID(VARCHAR2(250))MasterID(VARCHAR2(250))行:3500万

表5:Example_ChildA2ID列:ChildA2ID(VARCHAR2(250))ChildA2Name(VARCHAR2(250))主キー:ChildA2ID

等。、

各子テーブルには、MASTERIDと同等のエントリがある場合とない場合があります。したがって、すべてのMASTERIDとそれに関連するCHILD名を取得する必要があります。子のいずれにも同等の値がない場合は、「NULL」を返す必要があります。だから私は今マテリアライズドビュー構文の下にあります

 SELECT a.MasterName, c.ChildA1Name, e.ChildA2Name, g.ChildA3Name
 FROM 
 Example_Master a,
 Example_ChildA1 b,
 Example_ChildA1ID c,
 Example_ChildA2 d,
 Example_ChildA2ID e,
 Example_ChildA3 f,
 Example_ChildA3ID g
 WHERE 
 c.ChildA1ID(+) = b.ChildA1ID
 AND e.ChildA2ID(+) = d.ChildA2ID
 AND g.ChildA3ID(+) = f.ChildA3ID
 AND a.MasterID=b.MasterID (+)
 AND a.MasterID=d.MasterID (+)
 AND a.MasterID=f.MasterID (+)

上記のようにさらに5つの子テーブルに参加する必要があります。このクエリのコストは非常に高くなり、結果を取得するのに16分近くかかります。OUTER JOINSを使用するためのより良い方法はありますか?私の問題についてさらに詳しい情報が必要な場合はお知らせください。

ありがとう!

4

1 に答える 1

5

このような大きなテーブルを等結合する場合、期待できる最良の計画は一連のハッシュ外部結合であり、そのコストは通常​​、完全なテーブル スキャンのコストに加えて、大きなハッシュ テーブルがディスクに流出することによるオーバーヘッドに等しくなります。

全表スキャンのコストを実際に削減できるのは、カバーする索引がある場合のみです。

もちろん、大量のメモリを使用できるようにすることで、ハッシュ テーブルがディスクに流出する可能性を減らすことができますが、結合キーでテーブルを均等に分割することもできます。通常、これはハッシュ パーティション分割で行われ、ハッシュ テーブルがメモリ内に保持されないようにするために必要な数のハッシュ パーティションを使用します。ドキュメントの詳細: https://docs.oracle.com/cd/B28359_01/server.111/b32024/part_avail.htm#CIHCDBIF (または「パーティションごとの結合」を検索)

パーティションワイズ結合の利点を得るために並列クエリを使用する必要はないことに注意してください。シリアル クエリでも利点があります。

ところで、サブ 10g バージョンではないことに感謝してください。オプティマイザが最初に小さなテーブルにアクセスしてハッシュ テーブルを作成できなかったため、LARGE_TABLE LEFT OUTER JOIN SMALL TABLE と効果的に等結合できませんでした。 -- これは常にネストされたループになります :(

于 2013-03-18T19:59:40.353 に答える