同じスクリプト内の以前の同様の更新が約1時間で終了したときにハングするOracle Updateステートメントがあります。Oracle Updateステートメントがハングする
表A:ID、Masked_Account、Original_Account(9+万行、相互参照表)
私は2つのテーブルを持っています。
表B:UID、Prefix_Pan、Pan、Masked(13億行以上)。
テーブルBのパン列がテーブルAのMasked_Account列でテーブルBのパン列がaTable A Original_Account列と一致する各インスタンスで更新しようとしています。
バッチごとに1億回のバッチで更新を行い、その後コミットします。
UPDATE [TABLE B] optim
SET optim.PAN = (SELECT MASKED_ACCOUNT FROM [TABLE A] pans
WHERE optim.PAN = pans.ORIG_ACCOUNT), optim.MASKED = '1'
WHERE optim.OPTIM_UID > 1300000000
AND EXISTS (SELECT 1
FROM [TABLE A] pans
WHERE optim.PAN = pans.ORIG_ACCOUNT);
プラン(DBMS_XPLAN.DISPLAYを)説明:
UPDATE [TABLE B] optim
SET optim.PAN = (SELECT MASKED_ACCOUNT FROM [TABLE A] pans
WHERE optim.PAN = pans.ORIG_ACCOUNT), optim.MASKED = '1'
WHERE optim.OPTIM_UID BETWEEN 1200000000 AND 1300000000
AND EXISTS (SELECT 1
FROM [TABLE A] pans
WHERE optim.PAN = pans.ORIG_ACCOUNT);
私の最後の更新のSQLステートメントがハングし、決して終了しません:たとえば
は、以下の更新SQLスクリプトは約1時間で終了した記載されています結果:Plan hash value: 4037184420
----------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 250 | 9250 | 465K (1)| 00:00:10 |
| 1 | UPDATE | OPTIM_SMRY_FTR_CHKMC_EXTRACT | | | | |
|* 2 | HASH JOIN RIGHT SEMI | | 250 | 9250 | 239K (1)| 00:00:05 |
| 3 | INDEX STORAGE FAST FULL SCAN | IDX_PANS_ORIG_ACCT | 82 | 902 | 1(1)| 00:00:01 |
| 4 | TABLE ACCESS BY INDEX ROWID BATCHED| OPTIM_SMRY_FTR_CHKMC_EXTRACT | 32M| 796M| 228K (1)| 00:00:05 |
|* 5 | INDEX RANGE SCAN | PK_OP_47 | 22M| | 53465 (1)| 00:00:02 |
| 6 | TABLE ACCESS BY INDEX ROWID BATCHED | PANS | 1 | 22 | 604 (1)| 00:00:01 |
|* 7 | INDEX RANGE SCAN | IDX_PANS_ORIG_ACCT | 1 | | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("OPTIM"."PAN"="PANS"."ORIG_ACCOUNT")
5 - access("OPTIM"."OPTIM_UID">1300000000)
7 - access("PANS"."ORIG_ACCOUNT"=:B1)
Note
-----
- dynamic statistics used: dynamic sampling (level=AUTO)
誰もが、私はリットルで異なる何をする必要があるかを教えてもらえますast SQL(optim.OPTIM_UID> 1300000000)を更新して、ハングしないようにするか、Updateプロセス全体にどのようにアプローチする必要がありますか?
多くの質問があります。 1200000000から1300000000の間に実際に100ミリの行がありますか?私の推測はノーです。おそらく1300000000を超える行があります。ブロックロックを確認しましたか?一緒に動いているようですか? (元に戻す/ロールバックを使用して)dbasは何を言いますか? – tbone
実際には、1200000000から1300000000の間に1億の行があります。Optim_UIDは実際には 'rownum'です。表Bの総行数は1,322,566,115です。最後のUpdateバッチ(> 1300000000)を実行しようとした最後の時間に、ブロックされたロックは見られませんでしたが、22時間以上実行されていました。現在、他のより高い優先順位のためにdbasを見ることができません。 –
13億回の更新があり、それぞれにはmasked_accountのサブクエリが必要です。そして、私はこれのEXISTS部分が各行に対しても発火すると信じています。 2つのテーブルをジョインして作業テーブルに挿入する方が速いかもしれませんか?次にドロップして名前を変更しますか?最初に無効にできるoptim.PANのインデックスはありますか? – Stilgar