1

.NET Web アプリケーションから渡される配列の形式で入力を受け取るプロシージャを作成しました。

手順: テーブル内のすべてのデータを含むカーソルを開き、カーソルから行ごとにデータをフェッチし、検証ルールを適用します。

行ごとに、DB への複数のヒットが必要です (ほとんどの場合、ネストされたクエリが含まれます)。データの検証が失敗した場合はremarks、同じテーブルのフィールドを更新し (更新クエリをすぐに使用して)、検証が成功した場合は、他のテーブルにデータを挿入/更新します。

25 万件のレコードで試してみたところ、処理に 1 時間以上かかることがわかりました。

このストアド プロシージャのパフォーマンスを改善する必要があります。これを達成する方法を教えてください。

私はこれについて考えを持っています。

複数のレコード セット (各セットに 10 k) を作成し、マルチスレッドを使用する方法と同じように各セットを処理します。

これは可能ですか?はいの場合、どのように?

4

2 に答える 2

3

Oracle のマルチスレッドのような注意点があります。何かをバックグラウンドで (並行して) 実行する必要がある場合は、JOB または SCHEDULER_JOB が必要です。以下を使用して、シーケンシャル(バッチ)処理を「理論的に」高速化できます。

  • バルク/forall コンストラクト
  • UPDATE ステートメントの「WHERE OF CURRENT」条件
  • INSERT/UPDATE を MERGE ステートメントに置き換える
  • 結合で「メモリ内」テーブルを使用 - SQL タイプ「TABLE OF <something>」
  • PARALLEL ヒントを使用する - 一部の複雑な SQL クエリで

「PL」と「SQL」は2つの異なる「仮想」マシンであり、それらの間のコンテキストスイッチは(遅くなる可能性がある)遅いことに注意してください。

並列処理/マルチスレッドの使用は、Java/.NET の世界では一般的なソリューションです。Oracle では、このアプローチはあまり使用されていません。

于 2013-02-21T11:46:12.027 に答える
2

PL/SQL バッチ処理機能を使用すると、プロシージャーを高速化できる可能性が非常に高くなります。コードを並行して実行するには、DBMS_JOB および DBMS_SCHEDULER パッケージを参照してください。また、コードの一部が Parallel Query や Parallel DML によって高速化できるかどうかを確認してください。
特に明示カーソルを使用した場合は、行ごとに実行するのが最も遅くなります。

于 2013-02-21T07:27:14.550 に答える