2016-08-05 10 views
3

新しい環境に移行される運用データベースがあり、プロジェクトが開発段階にある間に特定の列と特定の表のデータを匿名化する必要があります。今匿名化されたデータを含む大きな(280M行)テーブルの更新

UPDATE ThisTable SET Description = 'Anonymised ' + TableKey 

問題は、テーブルのいくつかは、数百万行を持っているということです。たとえば -

サプライヤーは、データを置き換えるスクリプトを提供してきました。最大の行は284,000,000行です。

上記のステートメントは、もちろん、原因などなどロック、tempdbのと行バージョン、ログファイル、このようなテーブルのために働くことはありません

私は私が使用したスクリプトを持っているのどの前
1.ソーステーブルのPKの一時テーブルを作成します(そしてPKにインデックスを作成します):私はそれをやっているかの

現在のバージョン:本質は、以下のことを行います。
2.一時表から上位n個のPKを選択し、ソース表の適切な行を処理します。
3.ステップ2

から一時テーブルから
4反復を上位nのPKを削除これがうまく機能 - それは合理的な性能を与える(そしていくつかのメトリックが終了時刻を予測することができるようにし)。ただし、大きなテーブルで実行すると4日間の実行時間が予測されます。

私が行ったその他の措置は、データベースを単純復旧モードにすることです。

私たちはサーバーへの排他的アクセス権を持ち、それを使って「自分が望むことをする」ことができます。

コアの問題は、私たちが多数の行を話していることです。一つの考えは、BCP OUTをテキストファイルに変換し、オフラインで処理し、BCPを入力することです。しかし、まだ284,000,000行のテキストファイルを処理しています!

ASK:
これを達成する方法についての他の考えはありますか?これを行うための「シンプルな」方法が欠けていますか?名前すなわちテーブル名+一時

ステップ2とで

+0

データを匿名化する方法のサンプルを提供していただけますか? – TheGameiswar

+0

バッチで実行..... –

+0

一度にすべてを更新しようとすると実際にどうなりますか?私はそれを分割することがなぜ速くなるのか分からない。一度、主キーに基づいてrow_numberを使用し、次にrow_number%10000 = 0を使用して検出された10分の1レコードごとにキーを書き留めました。 – Cato

答えて

0

ステップ1クレート同じテーブル構造は、今テーブル名から選択からテーブル名+一時に挿入します。

つまり、tablenametempに挿入します。 tablenameの説明として「匿名化」+ TableKeyを選択します。あなたが制約している場合(検証後)

ステップ4ドロップtablename1

注意をTABLENAMEするtablename1とテーブル名+ショートカットに

ステップ3 [名前の変更]テーブル名、あまりにもそれらの名前を変更します作成します。

+0

これは確実にすべてを行い、より多くの作業が行われ、更新は単独で行われることになります。おそらく記録的なロックを避けるだろうが、DBは彼が望むことをするためのものだと思ったので、私は彼の記録的なロック問題を理解していない。 – Cato

+0

@AndrewDeightonに同意する - これはすでにソーステーブル。他のユーザーのためにテーブルをロックすることに問題はありません。データベースへの排他的アクセス権があります。 「ロック問題」に関して、私はおそらくそれについて間違っているでしょう(古い日に戻って考えていた)。しかし、我々は、RowVersionsでいっぱいになったTempDbによる単純なアップデートには問題があります。 –

+0

あなたはアップデートを行っていません、ここでは選択のみしています.. –

関連する問題