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 は、まったく同じ行を更新しようとしていました。その結果、事実上、すべてのスレッドが同期されます。