2

Oracle データベースにデータをインポートするための API として PL/SQL パッケージを使用する必要があります。最新の ojdbc ドライバーを使用して、Java アプリケーション内でこれを行っています。インポート中に使用しているすべてのステートメント (PreparedStatements の原因) は 1 回だけ初期化され、インポートするすべてのセットで再利用されます。

今、私は次の問題に直面しています: パッケージのプロシージャの最初の呼び出しは、1 つのセットに対して 90% 以上の時間を要します。インポート中に約 10 のプロシージャを呼び出す必要があり、最初のプロシージャは約 4 秒、残りは約 0.4 秒かかります。最初のプロシージャ コールをインポートするのに 10 番目または 100,000 番目のセットであっても、常にその時間がかかります。

知っておくべき重要なことは、最初の位置で別のプロシージャを呼び出している場合、これが 90% を占めることです。だから、私が間違っているかもしれません、それはパッケージの初期化に関するものですか? しかし、準備されたステートメントを (再) 使用している場合、それは最初の呼び出しでのみ発生するべきではありませんか?

PL/SQL パッケージには約 10,000 行のコードがあり、インポート中に他のいくつかのパッケージも呼び出します。

だから今私の質問は:

この問題の考えられる理由は何ですか? そして、潜在的な解決策は何ですか?原因を特定するために使用できるツールはありますか?

編集:読み込みが遅い原因を特定できました。間違ったコードなどとは何の関係もありませんでした。その理由は単純に、テスト シナリオで使用したデータの種類にありました。私の間違いは、常に同じデータをインポートすることでした。

スレッド 1 が最初の手順でデータセットを更新した場合、完全なインポート後のコミットまで、この行のロックを保持していました。スレッド 2 から n は、まったく同じ行を更新しようとしていました。その結果、事実上、すべてのスレッドが同期されます。

4

1 に答える 1

3

まず、これは正常ではありません。したがって、コードには間違いなく何か問題があります。しかし、ソースを確認できなければ、問題を特定することはできません。そして率直に言って、私は 10000 LOC をデバッグしたくありません。ごめん。

したがって、私たちができる最善のことは、いくつかの指針を提供することです。

1:

「パッケージのプロシージャの最初の呼び出しは、1 つのセットに対して 90% 以上の時間を要します。....最初の位置で別のプロシージャを呼び出している場合、これは 90% かかります」

おそらく、呼び出し元のプロシージャが特定の実行で最初に実行するプロシージャであるかどうかによって異なる動作をする、すべてのプロシージャが実行する共通のコードがいくつかあります。その不正なコードを見つける必要があります。

二:

" pl/sql 開発者でプロファイラーを使用しました。実行は非常に高速です。"

JDBC の PL/SQL Developer から呼び出すかどうかによって、プログラムの動作が異なります。そのため、PL/SQL コードではなく JDBC コードに問題がある可能性が高いです。データベース接続の取得は、間違いなく潜在的な問題の 1 つです。アーキテクチャによっては、ネットワーク トラフィックが別の問題になる場合があります。大量のデータを Java プログラムに返し、その後の手続き呼び出しで使用していますか?

要するに、PL/SQLコード内で、異なる手続き呼び出しで同じ結果を引き起こす可能性のある共通点を特定するか、PL/SQL DeveloperとJDBCでプログラムを呼び出したときに何が異なるかを特定する必要があります。

于 2012-04-25T15:10:44.107 に答える