Sql-Server

更改 nvarchar 列的大小時,是否需要刪除唯一索引?重新創建索引時表會被鎖定嗎?

  • January 16, 2014

在我們的數據庫中存在一個或多或少看起來像這樣的大表:

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

但現在串列欄位的大小已經變小了,所以我想將其更改為 32。Visual Studio 架構比較工具建議通過以下方式執行此操作:

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);

這真的需要嗎?或者更像是一種超級省錢的方式?

另外在重新創建唯一索引時,我的表會被鎖定嗎?因為這將是一個大問題(因為表有 3000 萬行,我猜重新創建索引需要相當長的時間),因為下一個維護視窗是未來幾個月。我的替代方案是什麼?

無需刪除並重新創建索引。

只需使用

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

這只是元數據更改。

將列從 更改NVARCHAR(16)NVARCHAR(32)根本不會影響儲存。

反過來(從 NVARCHAR(32)to NVARCHAR(16))會給你一個關於對象依賴於列的錯誤,所以也許 Visual Studio 總是生成那個樣板程式碼來代替檢查它是否真的需要。

引用自:https://dba.stackexchange.com/questions/56917