2016-07-26 4 views
0

私は現在、Oracle DBの1つのテーブルから別のテーブルにデータを移行するための準備として、1000を超える更新ステートメントを実行しようとしています。SQLで1000を超えるレコードを更新中

私は「(例:下)現在更新して、個々の更新文を出力します列に影響を受けるであろうすべてのレコードをループし、スクリプト...

UPDATE F_ASSET SET ZONE = 'Green/EHNET' WHERE ID = 3; 
UPDATE F_ASSET SET ZONE = 'Green/EHNET' WHERE ID = 1319; 
UPDATE F_ASSET SET ZONE = 'Green/EHNET' WHERE ID = 1324; 
UPDATE F_ASSET SET ZONE = 'Green/EHNET' WHERE ID = 1329; 
UPDATE F_ASSET SET ZONE = 'Yellow/IDMZ' WHERE ID = 1332; 
UPDATE F_ASSET SET ZONE = 'Green/EHNET' WHERE ID = 1333; 
UPDATE F_ASSET SET ZONE = 'Green/EHNET' WHERE ID = 1344; 
UPDATE F_ASSET SET ZONE = 'Green/EHNET' WHERE ID = 1359; 
UPDATE F_ASSET SET ZONE = 'Green/EHNET' WHERE ID = 1361; 
.... 

を持っていますこれらの更新ステートメント(または全く別のいくつかのメソッド)をすべて実行する最良の方法を見つけようとすると、パフォーマンスを低下させたり、一連のステートメントをグループ化してまとめたりする必要がありません。

ご協力いただきますようお願い申し上げます。

+2

テーブルに挿入し、内部結合を更新しますか? –

+0

パフォーマンスのためにソリューションをより複雑にしないでください。 1kのアップデートでは、最初の問題ではありません。テーブルはIDでインデックス付けされている限り、スクリプトは非常に速く実行されます。 –

+0

私は私がpl/sqlにコピーして実行する1000個の更新ステートメントを生成するために作成されたスクリプトに従っているかどうかはわかりません。私はテスト環境で200を実行しようとしましたが、初期化には5分かかりました。 – msleone

答えて

-1

たとえば、200個の更新の匿名PL/SQLブロックのチャンクに変換してみることができます。

BEGIN 
UPDATE F_ASSET SET ZONE = 'Green/EHNET' WHERE ID = 3; 
-- 200 more updates 
UPDATE F_ASSET SET ZONE = 'Green/EHNET' WHERE ID = 1319; 
END; 
BEGIN 
UPDATE F_ASSET SET ZONE = 'Green/EHNET' WHERE ID = 1324; 
-- 200 more updates 
UPDATE F_ASSET SET ZONE = 'Green/EHNET' WHERE ID = 1329; 
END; 

200には何も特別なものはありませんが、あまりにも多く、あなたはいくつかの制限を打つでしょう。開始/終了を手で編集することができます。
これで、実行する文は5つしかありません。非常に醜いですが、それは1つのオフとして、それは非常に効果的かもしれません。後で手を洗う!

ToadウィンドウまたはTSR(Toad Script Runner)を使用すると、「文ごと」のオーバーヘッドが原因でパフォーマンスが10倍から100倍向上します。ユーザーデータから簡単な挿入/更新ステートメントをExcelに構築するときに便利です。すべての自尊心のあるDBAは、プロダクション・ソリューションではないので、それを嫌う/ downvoteしますが、実際には1つのオフのために、それはうまく動作します。

関連する問題