実際には、1つのテーブルの1億レコードを更新する必要があります。つまり、列のvarchar値を単にIDに置き換えることでテーブルを正規化します。(「置換」と言いますが、実際にはIDを別の列に書き込んでいます。)
私が達成しようとしているのは、データセットを正規化することです。まだ正規化されていないデータにはインデックスがありません。私の考えは、更新が完了した後、varchar値をtinyint値で置き換える外部キーにインデックスを付けるのを待つ代わりに、生の値にインデックスを構築しないことでした。
UPDATE A
SET A.AutoClassID = B.AutoClassID
FROM AutoDataImportStaging.dbo.Automobile as A
JOIN AutoData.dbo.AutoClass as B on (A.AutoClassName = B.AutoClassName)
バックグラウンド
- サーバー2008 R2でMSSQL 2008 R2を使用
- サーバーには8 GBのRAMがあります
- サーバーには1つのRAID10、7200 RPM SATAがあります(すばらしいですが、本番環境ではこれはデータの読み取りのみを行い、データの書き込みは行いません。さらに、最近のHDの不足により、コストのためにこれが必要になりました)。
- サーバーにはデュアルクアッドコアXeon CPUが搭載されています
- マシンは他に何もしていません(現在は開発専用で、このプロセスのみ)
- 単純なロギングがオン(?-しかし、ロールバックできるようにログを記録しますか?)
- クエリは2つの異なるDBを参照することに注意してください。
- 更新されるテーブルのレコードの「幅」は455バイトです
実行中のリソース
- 物理RAMがいっぱいです
- ディスクI / Oが最大になりました
- CPUはほとんど何もしていません(チョークポイントはI / Oです)
- 実行時間は14時間で、カウントされています!
正規化の更新後に列(AutoClassName)を削除する場合でも、生データのインデックスが必要になるなど、いくつかのことが疑われます。また、JOINを開始するときにばかげて見えたJOINではなく、一度に1レコードずつテーブルをループダウンする必要があるのかどうかも疑問に思っていましたが、今はもっと高速だったようです。
残りの正規化更新(これと同様)の方法をより迅速に変更するにはどうすればよいですか?
TOP
条項を使用したバッチ更新に同意します。それが私のアプローチです。