適用於:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric 中的 SQL 資料庫
您可以使用 SQL Server Management Studio 或 Transact-SQL 在資料表中建立叢集索引。 除了極少數的例外狀況之外,每個資料表都應該要有叢集索引。 除了可以改善查詢效能以外,叢集索引還能夠視需要加以重建或重新組織,以便控制資料表分散程度。 檢視上也可以建立叢集索引。 (叢集與非叢集索引一文中定義了叢集索引。)
典型實作
實作叢集索引的方法如下:
PRIMARY KEY和UNIQUE約束**建立
PRIMARY KEY條件約束時,若資料表上沒有存在叢集索引,而且您未指定唯一的非叢集索引,則資料行上會自動建立唯一的叢集索引。 主索引鍵資料行不允許NULL值。當您建立
UNIQUE條件約束時,依預設會建立唯一的非叢集索引,以強制UNIQUE條件約束。 若資料表上還沒有叢集索引,您可以指定唯一叢集索引。隨條件約束一起建立的索引,會自動採用與條件約束名稱相同的名稱。 如需詳細資訊,請參閱 主索引鍵和外部索引鍵限制 和 唯一限制和檢查限制。
獨立於條件限制之外的索引
如果已指定非叢集的主索引鍵條件約束,您可以在主索引鍵資料行以外的資料行上建立叢集索引。
Limitations
建立叢集索引結構時,個別的檔案和檔案群組中都必須有磁碟空間來保存舊 (來源) 結構和新 (目標) 結構。 除非認可整個交易,否則舊結構的配置不會取消。 此外,可能還需要額外的暫存磁碟空間以供排序之用。 如需詳細資訊,請參閱 Disk Space Requirements for Index DDL Operations。
若叢集的索引建立於含多個現有非叢集索引的堆積上,所有的非叢集索引都必須重建,以便讓它們包含叢集索引鍵值,而非資料列識別碼 (RID)。 同樣地,若擁有多個非叢集索引之資料表上的叢集索引被卸除了,非叢集索引將會全部重建,做為
DROP操作的一部份。 在大型資料表中,此處理流程可能會花許多時間。在大型資料表上建立索引的較佳方式是以叢集索引開始,然後建立任何非叢集索引。 請考慮將選項設定
ONLINE為ON在現有資料表上建立索引時。 當設定為ON時,不會保留長期資料表鎖定。 這樣一來,基礎資料表上就可以繼續執行查詢或更新動作。 如需詳細資訊,請參閱 線上執行索引作業。叢集索引之索引鍵所包含的 varchar 資料行,不能在
ROW_OVERFLOW_DATA配置單位中有現有資料。 如果在 varchar 資料行上建立叢集索引,且現有的資料在IN_ROW_DATA配置單位中,則後續在可能發送資料非資料列的資料行上進行的插入或更新動作會失敗。 若要取得可能包含資料列溢位資料之資料表的相關資訊,請使用 sys.dm_db_index_physical_stats (Transact-SQL) 動態管理函數。
Permissions
必須具備資料表或檢視的 ALTER 權限。 使用者必須是 系統管理員 固定伺服器角色的成員,或是 db_ddladmin 和 db_owner 固定資料庫角色的成員。
使用 SQL Server Management Studio
使用物件總管建立叢集索引
在 [物件總管] 中,展開要在其中建立叢集索引的資料表。
以滑鼠右鍵按一下 [索引] 資料夾,指向 [新增索引],然後選取 [叢集索引…]。
在 [新增索引] 對話方塊,於 [一般] 頁面上的 [索引名稱] 方塊中輸入新索引的名稱。
選取 [索引鍵資料行] 下的 [新增...]。
在 [從table_name選取數據行] 對話框中,選取要新增至叢集索引之數據表數據行的複選框。
請選擇 [確定]。
在 [新增索引] 對話方塊中,選取 [確定]。
使用資料表設計工具建立叢集索引
在 [物件總管] 中,展開要在其中建立包含叢集索引之資料表的資料庫。
以滑鼠右鍵按一下 [資料表] 資料夾,然後選取 [新增資料表…]。
像平常一樣,建立新資料表。 如需詳細資訊,請參閱建立資料表 (資料庫引擎)。
以滑鼠右鍵按一下先前建立的新資料表,然後選取 [設計]。
在 [資料表設計工具] 功能表中,選取 [索引/索引鍵]。
在 [索引/索引鍵] 對話方塊中,選取 [加入]。
從 [選取的主索引鍵/唯一索引鍵或索引] 文字方塊中選取新索引。
在方格中,選取 [ 建立為叢集],然後從屬性右側的下拉式清單中選擇 [ 是 ]。
選取 關閉。
在 [檔案] 功能表中,選取 [儲存]table_name。
使用 Transact-SQL
在物件總管中,連線到資料庫引擎的執行個體。
在標準列上,選取 [新增查詢]。
複製下列範例並將其貼到查詢視窗中,然後選取 [執行]。
USE AdventureWorks2022; GO -- Create a new table with three columns. CREATE TABLE dbo.TestTable ( TestCol1 INT NOT NULL, TestCol2 NCHAR(10) NULL, TestCol3 NVARCHAR(50) NULL ); GO -- Create a clustered index called IX_TestTable_TestCol1 -- on the dbo.TestTable table using the TestCol1 column. CREATE CLUSTERED INDEX IX_TestTable_TestCol1 ON dbo.TestTable (TestCol1); GO
如需詳細資訊,請參閱 CREATE INDEX。