Sql-Server

在 64GB 表上更改聚集索引的最快方法是什麼?

  • March 3, 2022

我們有一個表(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);它可能會更快。我不知道。對不起,我現在沒有時間為你測試:(

**標準版:**您必須安排維護時段

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