2017-01-26 11 views
0

アカウントテーブルで500万行を更新する必要があります。更新プログラム名 - マルチミリオンレコード

update account set name = 'NEW PROGRAM NAME' where progid = 1111; 

ただし、定期的な更新が実行され、1.5時間実行されていました。私はそれをキャンセルしなければならなかったし、キャンセルするのに時間がかかりました。それは混乱だった。

可能な限り短時間で、すばやく更新する方法に関する専門家のアドバイスが必要です。

私は1つのスクリプトを好む。しかし、私は考えていた可能性があります:

update account set name = 'NEW PROGRAM NAME' where progid = 1111 and rownum <= 500000; 

コミット?

答えて

0

あなたは非常に接近している:

update account 
    set name = 'NEW PROGRAM NAME' 
    where progid = 1111 and name <> 'NEW PROGRAM NAME' and 
      rownum <= 5000; 

あなたが繰り返しの間でコミットして、この更新を行うことができます。

0
  1. フィールドprogidのインデックスを追加してください。

  2. は、私はあなたが1つのスクリプトを5万行を更新することはお勧めしません名前<>フィルタレコードに「NEW PROGRAM NAME」

  3. を1つの以上の条件を追加します。行ロックを避けるために、バッチごとに5000レコードを更新する必要があります。

  4. データベース設計を変更できる場合は、データベースの正規化を実行する必要があります。あなただけのテーブル内のレコードの1を更新するよう

    While (Select Count(1) From account Where progid = 1111 and name <> 'NEW PROGRAM NAME') > 0 
    Begin 
    update account 
    set name = 'NEW PROGRAM NAME' 
    where progid = 1111 and name <> 'NEW PROGRAM NAME' and 
        rownum <= 5000; 
    End 
    
「プログラム」プログラムIDと名前を格納するテーブル「プログラム」を作成し、テーブル「アカウント」のみのフィールドのProgIDを保存します