Sql-Server
在 64GB 表上更改聚集索引的最快方法是什麼?
我們有一個表(64 GB 大小,256795926 行),它的 PK(聚集)索引非常糟糕。目前它是一
varchar(99)
列(平均大小為 50 個字元)。已經有一個
bigint identity
列,所以我們想將 PK 轉換為該列。然而改變 PK 是不可能的,所以 drop / recreate 似乎是唯一的解決方案。但是這個表是不斷更新的,所以停機時間必須是最短的。我們有 SQL Server 2019 Enterprise,但我想線上刪除/重新創建會很長時間,而且日誌文件也會很大。
我正在考慮用正確的結構重新創建一個新表,將最新的 ID 傳輸到這個新表(所以我的身份沒問題)並將數據傳輸到這個新表。在我看來,這將使停機時間最少,但有人有更好的主意嗎?
如果您不能採取停機時間,那麼複製到新表,然後在事務中進行最終增量複製/重命名/刪除是唯一的方法。
您有 2 個選擇:
**企業版:**如果您使用的是 SQL Server 企業版,則可以使用
WITH (ONLINE=ON)
:DROP INDEX [Old_Index] ON dbo.Table; GO CREATE UNIQUE CLUSTERED INDEX CX_Table ON dbo.Table(ID) WITH (ONLINE=ON); GO
我還沒有測試,但你也可以使用
WITH (DATA_COMPRESSION = ROW, ONLINE = ON);
它可能會更快。我不知道。對不起,我現在沒有時間為你測試:(**標準版:**您必須安排維護時段