まず、これをやってくれてありがとう。多くの人があまり価値を感じないほど明らかな勝利ですが、それだけの価値はあります:)。世界をほんの少しだけ正気にします。
IsActive
について ブール値であること。私の推測では、あなたはそれを BIT
にすることを考えています。 分野。それが良い方法かもしれませんが、TINYINT
を使用した方がよい場合もあります。 意味を 2 つ以上の状態に拡張する可能性があるためです。その場合、実際には StatusID
のほうが多くなります .通常、Active として単純に開始する場合です。 / 非アクティブ 、しかし後で削除される可能性があります および/またはその他。サイジングの観点から、TINYINT
は常に 1 バイトです。一方、BIT
1 バイト 最大 8 BIT
フィールド .つまり、1 つの BIT
フィールドは 1 バイト、2 BIT
fields も 1 バイトで、最大 8 BIT
まで続きます。 フィールドは 1 バイトで格納されます。したがって、BIT
を選択してもスペースの節約にはなりません TINYINT
以上 テーブルに BIT
が 1 つしかない場合 分野。考慮すべき点です。
見てきたように、ALTER TABLE を実行するのは、大きなテーブルでは少し大変です。素晴らしいものではありませんが、1 つのオプションは NOT NULL
を追加することです。 field--Number_1new
-- DEFAULT
付き 値 (これは、少なくとも SQL 2012 以降ではデフォルトにより瞬時になります) が自然には持たない値 (例:255) であり、その後、次のように、ループ内でゆっくりと値を移行します:
UPDATE TOP (5000) tab
SET tab.Number_1new = tab.Number_1
FROM [table] tab
WHERE tab.Number_1new = 255;
それが終わったら、次のことを行います:
sp_rename 'table.Number_1', 'Number_1old', 'COLUMN';
sp_rename 'table.Number_1new', 'Number_1', 'COLUMN';
もちろん、それを TRANSACTION でラップし、それを TRY / CATCH でラップするのが最善です。関連するコードが更新され、すべてがテストされ、データが良好に見えたら、Number_1old
をドロップできます。
ただし、私が見つけた最善の方法は、新しいテーブルを作成し、データをゆっくりと移行してから、テーブルとコードを同時に交換することです。 SQL Server Central の記事 Restructure 100 Million Row (または詳細) 秒単位のテーブル。 SRSLY! (無料登録が必要です)。その記事に到達する際に問題が発生した場合に備えて、基本的な手順は次のとおりです:
<オール>AFTER UPDATE, DELETE
[テーブル] で変更を同期します (ただし、新しい行について心配する必要はありません)INSERT INTO [tableNew] (Columns) SELECT TOP (n) Columns FROM [table] WHERE ?? ORDER BY ??
WHERE table.[id] > @MaxIdInTableNew ORDER BY table.[id]
.INT
に変換する 2 つの FK の PK 参照) s) 次に、これらのフィールドをここに INT
にします。 これらの他のテーブルが INT フィールドを PK として持つように移行されるまで、FK を追加しないでください。 FK フィールドを変更するためだけに、このテーブルを再構築する必要はありません。