web-dev-qa-db-ja.com

nvarchar列のサイズを変更する場合、一意のインデックスを削除する必要がありますか?インデックスを再作成すると、テーブルがロックされますか?

私たちのデータベースには、多かれ少なかれこのように見える大きなテーブルが存在します:

CREATE TABLE dbo.production_data
(
    pd_id BIGINT PRIMARY KEY,
    serial NVARCHAR(16) NOT NULL UNIQUE,
    ...
);

しかし、シリアルフィールドのサイズが小さくなったので、32に変更します。VisualStudioスキーマ比較ツールは、次の方法でこれを行うことを提案しています。

DROP INDEX ux_production_data_serial ON dbo.production_data;
GO
ALTER TABLE dbo.production_data ALTER COLUMN serial NVARCHAR(32) NOT NULL;
GO
CREATE INDEX ux_production_data_serial ON dbo.production_data(serial ASC);

これは本当に必要ですか?またはこれを行う超保存方法のように?

また、一意のインデックスを再作成すると、テーブルがロックされますか?これは大きな問題になるでしょう(テーブルに3,000万行あり、インデックスの再作成にはかなり時間がかかると考えられるため)。これは、次のメンテナンスウィンドウが数か月先になるためです。私の選択肢は何ですか?

14
Staeff

インデックスを削除して再作成する必要はありません。

使うだけ

_ALTER TABLE dbo.production_data
  ALTER COLUMN serial NVARCHAR(32) NOT NULL; 
_

これはメタデータのみの変更です。

列をNVARCHAR(16)からNVARCHAR(32)に変更しても、ストレージにはまったく影響しません。

逆に(NVARCHAR(32)からNVARCHAR(16)に)進むと、オブジェクトが列に依存しているというエラーが発生しますが、Visual Studioは常に、 実際にが必要かどうかを確認します。

24
Martin Smith