私たちのデータベースはSQL Server 2008 R2です。 datetime2またはbigintに切り替えたいvarchar(500)列のあるテーブルがあります。切り替えられる列のすべてのデータが適切なタイプに対して有効であることを保証できます。列の変更はインデックスには影響しますが、キーには影響しません。
同僚と話し合っている間、私たちは問題に取り組むための2つの方法を見つけました。これらは両方ともT-Sqlスクリプトを介して行われます。
ALTER TABLE x ALTER COLUMN Y datetime2
を使用して現在のテーブル/データ型を変更し、インデックスを再構築または再作成します。データがきれいに変換されると確信しているので、私は#2に傾いています。私の同僚とDBAの友人は#1を好みますが、私の同僚はなぜ彼らが彼をそのように訓練したのか思い出せません。 DBAの友人は休暇中なので、理由を尋ねませんでした。
誰かがより良いと思うオプションとその理由について洞察を提供できますか?結局のところ、それは私の決定であり、なぜ#1が#2よりも優先されるのでしょうか。
私は最近、10億行以上のテーブルを処理したいと思っていた組織でこれを行いました。
アイデアのすべての功績はアーロンバートランド氏にあり、彼のブログ投稿からのものです Trick Shots:Schema Switch-A-Roo
以下のプロセスを小さなテーブルでテストし、PRODで実行する前に快適にしてください。
fake
およびshadow
を承認dbo
で作成します。shadow
スキーマに必要な列とデータ型を含むテーブルを作成します。 _create table shadow.Correct_Table ...
_shadow
スキーマテーブルに持つすべてのインデックスを作成します。shadow
スキーマを使用してテーブルの統計を更新します。スキーマを切り替える(これはメタデータ操作であり、非常に高速です)
_--- ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName;
BEGIN TRANSACTION;
ALTER SCHEMA fake TRANSFER dbo.original_table;
ALTER SCHEMA dbo TRANSFER shadow.Correct_Table;
COMMIT TRANSACTION;
ALTER SCHEMA shadow TRANSFER fake.Lookup;
_
最終チェックを行って、すべてが計画どおりに進んだかどうかを確認します。 select count(1) from dbo.Correct_table
を実行する必要があります
手順7を確認して問題がなければ、_shadow.table
_、shadow
スキーマおよびfake
スキーマをクリーンアップとして削除します。
これが私の見方です。
#1の長所
#2の長所
言われていることはすべて、私は通常、小さなテーブルまたは停止が発生する可能性がある場合は常に#2を使用します(ただし、常に事前にバックアップを取ります)。列の順序など。#1を行う場合は、通常、GUIを使用してスクリプトを生成し、実行する前に注意深く確認します。
ドロップおよび再作成オプションに注意してください。これにより、sys.dependsが奇妙な状態のままになり、列の順序またはタイプが変更されるキャッシュされたプランで問題が発生する可能性があります。
オブジェクトレベルの権限はDROP
で失われ、後続のCREATE
で自動的に再作成されないため、これらの権限を維持するための手順を実行する必要もあります。
ALTER TABLE
はよりクリーンなオプションIMOですが、本番環境でそれを行う前に徹底的にテストして、すべてが正常であることを確認し、操作にかかる時間を確認してください(多くの行があるテーブルでは、これはかなり長くなる可能性があります)時間)。
私の同僚は、彼が何を参照しているかについての記事を見つけてしまいました: http://www.nigelrivett.net/SQLAdmin/AlterTableProblems.html 。これを読んで、年末のレポートが近づいていることに気づいた後、列の型に変更を加えないことを決定し、今後数か月でこれを再検討します。記事を読んだ後は、Drop/Createメソッドを使用するだけかもしれません。
これについてフィードバックをくださった皆さんに感謝します。前進することを決定する際に考慮すべき多くの興味深いアプローチ。