列のサイズを変更するとテーブルがロックされますか?

列のサイズを変更するとテーブルがロックされますか?

列を nvarchar(2) から nvarchar(10) に変更するか、列を char(2) から nvarchar(10) に変更するとどうなりますか。これによりテーブルがロックされ、再編成されますか。それとも、影響やダウンタイムなしで動作しますか。

列を変更すると何が起こるか調べようとしましたが、何も見つかりませんでした。変更する列が 1 つまたは 2 つある大きなテーブルです。MS SQL Server 2008 R2 に関するものです。

答え1

最も簡単な方法は、テスト環境を使用してダミー テーブルといくつかのダミー レコードを作成し、説明した変更を適用して、プロファイラーを通じてアクションをトレースすることです。

または、SSMS で設計されたテーブル内のテーブルを変更し、「変更スクリプトの生成」ボタンを使用します。列を Char(2) から NVARCHAR(10) に変更すると、変更スクリプトの生成によって次のものが生成されます。

   CREATE TABLE dbo.Tmp_t2
    (
    id int NULL,
    c1 nvarchar(50) NULL,
    c2 nvarchar(2) NULL
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_t2 SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.t2)
     EXEC('INSERT INTO dbo.Tmp_t2 (id, c1, c2)
        SELECT id, CONVERT(nvarchar(50), c1), c2 FROM dbo.t2 WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.t2
GO
EXECUTE sp_rename N'dbo.Tmp_t2', N't2', 'OBJECT' 
GO
COMMIT

答え2

ALTER コマンドを使用している場合は、別のテーブルが作成され、既存のデータが新しいテーブルにコピーされ、完了したら古いテーブルが削除され、新しいテーブルの名前が古いテーブル名に変更されます。ライブ データベース中にこれを実行するのはベスト プラクティスではないと思いますが、実稼働データを処理する方法はあります。

http://www.sqlmag.com/article/tsql3/resizing-a-column-in-a-large-table.aspx

答え3

テーブル列のデータ型が変更されているときは、他の操作 (挿入、更新、削除など) は実行できず、テーブル全体がロックされます。また、NOLOCK で選択することもできません。

関連情報