3

すべてのテーブルのすべてのテーブル定義を取得したい。そして、私はそれを速くしたいです(それは私が頻繁に実行しているスクリプトの一部です)

私は oracle 11g を使用しており、700 個のテーブルがあります。プレーンな jdbc コードでは、4 分かかり、次のようになります。

s = con.statement("select DBMS_METADATA.GET_DDL(object_type,object_name) from user_objects where object_type = 'TABLE');
s.execute();
rs = s.getResultSet();
while(rs.next()){
 rs.getString(1);
}

SO 私はこのコードを最適化し、約 20 秒に到達したいと考えています。

Rownum で mod を使用して、それぞれがデータベースへの接続を開き、情報の一部を読み取る 14 のスレッドを作成することで、既に 40 ~ 50 秒に達しています。

しかし、これでは十分ではありません。

私はこれらの方向で考えています:

  1. http://docs.oracle.com/cd/B10501_01/java.920/a96654/connpoca.htm#1063660 - 接続キャッシュ。私の 14 個の接続を connectionCaching に置き換えることで、処理速度を上げることができますか?

  2. この関数がアクセスするテーブルをKEEPバッファキャッシュ領域に保持することはできますか?

  3. とにかく、ここでいくつかの情報をインデックス化しますか?

  4. 他の提案は大歓迎です。

ありがとうございました

4

3 に答える 3

5

テーブルが変更されていない場合でも、常に DDL を取得する必要がありますか? それ以外の場合は、最後に取得してから ALL_OBJECTS.LAST_DDL_TIME が変更されたテーブルの DDL のみを取得します。

別のオプションは、一度に複数のテーブルを取得できる方法で独自の GET_DDL を作成することです。

于 2013-10-10T05:18:02.430 に答える
1

まず、変更のみをキャプチャするという HAL の提案に賛成しますが、必要のないオプション (たとえば、STORAGE 句など) を削除することも検討します。

于 2013-10-10T10:32:26.243 に答える
1

残念ながら、それを速くするのは簡単ではありません。GET_DDL 全体が Java で実装され、生成プロセスの一部として XSLT 変換が使用されます。

多分あなたはこれをより速く見つけるでしょう。 http://metacpan.org/pod/DDL::オラクル

于 2013-10-10T07:11:27.440 に答える