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


14

私たちのデータベースには、次のような多かれ少なかれ大きなテーブルがあります。

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万行あり、インデックスの再作成にはかなり時間がかかると思います)。これは、次のメンテナンスウィンドウが数か月先になるためです。私の選択肢は何ですか?

回答:


24

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

使うだけ

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

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

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

(から他の方法でラウンド行く NVARCHAR(32)には、 NVARCHAR(16)ので、多分Visual Studioがちょうど常にそれがされているかどうかをチェックする代わりに、そのボイラープレートコードを生成しますが)あなたの列に依存しているオブジェクトに関するエラーを与えるだろう、実際に必要。


2
Visual StudioがDROP / CREATE INDEXとしてスクリプトを作成する理由を知りたい。おそらく不要で無条件のCYA。
アーロンバートランド

2
@AaronBertrand-不要な場合の最適化が不足しているだけだと思います。書籍オンラインこれは、製品が実際にもそれを必要としないいくつかのケースで必要とされることを示した。このアップデートまで
マーティン・スミス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.