新しいフィールドを大きなテーブルに追加するときに気づいていますが、中央のどこかではなく、フィールドの最後に追加することをお勧めします。フィールドタイプを変更するときに、このようなことが当てはまるかどうか疑問に思いますか?
いくつかのVARCHARタイプのフィールドを持つ約100万レコードのテーブルがあります。これらをNVARCHARに変更したいと思いますが、理解すると、フィールドがテーブルの中央にあり、SQL Serverが大量のコピー/並べ替えを行う必要があるため、これには時間がかかり、リソースがかかります。
これを達成する効率的な方法は何ですか?
質問に直接答えるには、操作を実行する2つの方法があります。
大きなテーブルに関する注意:テーブルに数千以下のレコードがある場合、一度に操作を実行できます。 100万レコードのテーブルの場合は、バッチで実行する方が現実的です(たとえば、毎回数千または数百のレコードとしましょう)。
Pseudo-tempカラム
疑似一時列(別の適切な名前があるかどうかは忘れました)は、変換の結果を格納するために使用される列です。この場合、それらはプロセス後の最後の列にもなります。
これは---(Aaronの答え で詳述されているのと同じプロセスです。
疑似一時テーブル
変更が少数の列にある場合は、古いテーブルのスキーマに基づいて新しいテーブルを作成する方が現実的です。
ステップ4に関する注意:重複インデックスが検出された場合(重複インデックスの検出は非常に長い件名です。SQLSkills.comのKimberly Trippのブログを参照してください)、これがチャンスですその場合はそれらを取り除く。
パフォーマンスへの影響
VARCHARからNVARCHARに変更すると、少なくとも2008R2より前のSQL Serverでは、パフォーマンスにいくつかの影響があります。 SQL 2008 R2の場合、Aaron BertrandがUnicode圧縮機能に関するいくつかのブログ投稿を公開しています。これは、NVARchar列がVARCHAR列に格納できるコンテンツの格納に使用される場合にバランスを取ることができます。記事に値するので完全には読みませんでしたが、主題は興味深いです。
通常、NVARCHAR列は(IOW、2008R2より前)、すべての文字を1文字あたり2バイトで列に格納します。たとえば、文字列 'MSSQL'はVARCHAR列に5バイト、NVARCHAR列に10バイトで格納されます。非LOB文字列の列は最大8000bytesを格納するように制限されているため、NVARCHRは4000に制限されているのに対し、VARCHARは8000文字を格納できます。
その事実の影響:
編集:gbnが述べたように、NVARCHAR列をフルフィルする必要がある明確な要件がある場合は、VARCHARを使用するだけで何かを作成する価値はありません。
片道可能性があるする:
これは長期的には速くはならず、メンテナンスウィンドウも必要です(一時的なトリガーを配置しない限り、ユーザーが既に更新した行を更新したくないためです)。巨大なトランザクションといくつかの更新後、それがかかる時間についてより多くの予測可能性を提供します。
新しいテーブルを作成し、名前を変更したら同じことを行うことができます。これにより、手順5の必要性が回避されますが、データチャーンがさらに発生し、制約、外部キー、トリガーにより問題が発生する可能性があります。テーブルに関係する可能性のあるものなど。