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