1

一部のデータを集計し、結果を効率的なクエリに使用する別のテーブルに挿入するプロセスがあります。私たちが直面している問題は、複数のアグリゲーターがほぼ同時に実行されていることです。

この新しいテーブルでは、元のレコード ID を主キーとして使用します (一意の制約)。ただし、2 つの集計プロセスが同時に実行されている場合、そのうちの 1 つが一意制約違反でエラーになります。

最初のライターが終了するまで 2 番目のライターを待機させるロック機構を指定する方法はありますか? または、その特定の行を無視して残りを続行するようにオラクルに指示する方法はありますか?

残念ながら、集計を単一のプロセスに減らすことは現実的ではありません。次の手順は、利用可能なデータの最新バージョンに依存しており、これらの手順はスケールアウトする必要があるためです。

編集:

以下は私の[編集済み]クエリです。

INSERT INTO
agg_table
SELECT
h.id, h.col, h.col2
FROM history h
JOIN call c
ON  c.callid = h.callid
WHERE
h.id > (SELECT coalesce(max(id),0) FROM agg_table)
4

3 に答える 3

3

エラー ログ句を指定してINSERTステートメントを実行することができます。Oracle ドキュメントの例は次のとおりです。

INSERT INTO dw_empl
  SELECT employee_id, first_name, last_name, hire_date, salary, department_id 
  FROM employees
  WHERE hire_date > sysdate - 7
  LOG ERRORS INTO err_empl ('daily_load') REJECT LIMIT 25

[MERGE][2]または、ステートメントを使用してみてください。詳細テーブルから選択すると、要約テーブルにマージされます。一致するものが見つからない場合は、あなたINSERTと、見つかった場合はUPDATE. このソリューションで同時実行の問題を処理できると思いますが、テストする必要があります。

于 2013-02-18T05:20:41.450 に答える
0

複数の挿入がそれぞれの動作を確認できないという問題を回避する方法がないため、挿入をシリアル化することがおそらく最良の方法です。

DBMS_Lock は、おそらく適切なシリアライゼーション メカニズムです。

于 2013-02-18T10:58:10.277 に答える