列を 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 で選択することもできません。