2017-09-24 4 views
0

私はOracleで階層データを取得するためにstart with節を使用しようとしています。 、 IDSTART WITHはOracle SQLの存在条件を使用しています

テーブルB(スキーマ)(350億行)の費用:

TableAの(スキーマ)(6万行):私は、以下の2つのテーブルを持っている IDを、私たちは行きたい

をPARENT_ID表Aから、idに再帰的に関連するすべてのparent_idsを取得します。以下のクエリのような何か:

Select * from TableB START WITH id in (select id from TableA) 
connect by id = prior parent_id and parent_id != id 

上記1がテーブルAの行の数が少ないために動作しますが、私はテーブルA 6万行を持っており、テーブルBは350億行を有する場合、これをやろうとしています。

この場合、階層データを取得するにはどのような推奨方法がありますか(exists句のようなもの)? 'between'を試しても、必要ではないたくさんのIDが生成されます。

何か助けてください。

+0

TableAの条件はどのようなものになるのですか? –

答えて

0

は、その大きなデータセットを使用すると、うまく

あなたのクエリは正しいですが、TableAの

select * from TableB 
start with id in (select id from TableA where <condition on TableA>) 
connect by id = prior parent_id and parent_id != id 

上の条件最も重要なのものである必要がありますが、テーブルA

から選択されているものにフィルタリングする必要があります。 を - テーブルAにはフィルタリングに使用する列のインデックスがあります(条件) - テーブルBにはプライマリキーまたはユニークキーIDがあります

クエリがTableAのインデックスを使用して終了した場合列の数が多すぎない)、TableBのUNIQUEキーを使用すると、うまく動作するはずです。

しかし、私はAの各レコードについてBの平均レコードを〜6,000レコードと計算しました!

あなたがテーブルBによって取得したレコードのセットを削減する必要がある場合は、あなたがより良い実際には、データのような大規模なvolumnが常に適切にあなたが何も言及しなかった、分割されなければならない

select * 
from (select * TableB where <condition to be applied before connect by>) 
start with id in (select id from TableA where <condition on TableA>) 
connect by id = prior parent_id and parent_id != id 

で接続する前に、これを行います約

関連する問題