Назад | Перейти на главную страницу

Блокирует ли изменение размера столбца таблицу?

Что произойдет, если я изменю столбец с nvarchar (2) на nvarchar (10) или столбец с char (2) на nvarchar (10). Эта блокировка, реорганизация таблицы или это работает без каких-либо последствий или простоев?

Я попытался выяснить, что произойдет, если я изменю столбец, но ничего не нашел. Это большая таблица с одним или двумя столбцами, которые нужно изменить. Это о MS SQL Server 2008 R2.

Самый простой способ выяснить это - использовать тестовую среду, создать фиктивную таблицу, и некоторые фиктивные записи применяют изменение, о котором идет речь, а затем отслеживают действия с помощью профилировщика.

ИЛИ Измените таблицу в таблице, созданной в 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

Если вы используете команды ALTER, он создаст другую таблицу, скопирует существующие данные в новую таблицу, по завершении отбросит старую таблицу, а затем переименует новую таблицу со старым именем таблицы. Я не думаю, что это лучший способ делать это во время работы с базой данных, но есть методы для работы с производственными данными.

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

Никакая другая операция (например, вставка обновления и удаление) не может быть выполнена при изменении типа данных столбца таблицы, вся таблица будет заблокирована. также нельзя выбрать с помощью NOLOCK.