建立非叢集索引
適用於:Microsoft Fabric 中的 SQL ServerAzure SQL 資料庫 Azure SQL 受控執行個體 SQL 資料庫
您可以使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 中建立非叢集索引。 非叢集索引是與資料表中所儲存之資料不同的索引結構,可重新排序一個或多個選取的資料行。 非叢集索引經常可協助您以比搜尋基礎資料表更快的速度找到資料;查詢的結果有時會完全來自非叢集索引中的資料,或是非叢集索引可能會將資料庫引擎指向基礎資料表中的資料列。 一般而言,建立非叢集索引是為了改善叢集索引未涵蓋但經常使用之查詢的效能,或尋找沒有叢集索引之資料表中的資料列 (稱為堆積)。 您可以在資料表或索引檢視表上建立多個非叢集索引。
開始之前
一般實作
非叢集索引的實作方法如下:
UNIQUE 條件約束
當您建立 UNIQUE 條件約束時,依預設會建立唯一的非叢集索引,以強制 UNIQUE 條件約束。 若資料表上還沒有叢集索引,您可以指定唯一叢集索引。 如需詳細資訊,請參閱 Unique Constraints and Check Constraints。
獨立於條件限制之外的索引
依預設,若是未指定叢集索引,則會建立非叢集索引。 每個資料表可建立的最大非叢集索引數目是 999 個。 這包含 PRIMARY KEY 或 UNIQUE 條件約束所建立的任何索引,但不包含 XML 索引。
索引檢視上的非叢集索引
在檢視上建立唯一的叢集索引後,就可以建立非叢集索引。 如需詳細資訊,請參閱建立索引檢視表。
安全性
權限
需要資料表或檢視表的 ALTER 權限。 使用者必須是 系統管理員 固定伺服器角色的成員,或是 db_ddladmin 和 db_owner 固定資料庫角色的成員。
使用 SQL Server Management Studio
若要使用資料表設計工具建立非叢集索引
在 [物件總管] 中,展開包含您要建立非叢集索引之資料表的資料庫。
展開 [資料表] 資料夾。
以滑鼠右鍵按一下要建立非叢集索引的資料表,然後選取 [設計]。
以滑鼠右鍵按一下您要建立非叢集索引的資料行,然後選取 [索引/索引鍵]。
在 [索引/索引鍵] 對話方塊中,選取 [加入]。
從 [選取的主索引鍵/唯一索引鍵或索引] 文字方塊中選取新索引。
在方格中,選取 [建立成 CLUSTERED],然後從屬性右邊的下拉式清單中選擇 [否]。
選取關閉。
在 [檔案] 功能表中,選取 [儲存] table_name。
若要使用物件總管建立非叢集索引
在 [物件總管] 中,展開包含您要建立非叢集索引之資料表的資料庫。
展開 [資料表] 資料夾。
展開您要建立非叢集索引的資料表。
以滑鼠右鍵按一下 [索引] 資料夾,指向 [新增索引],然後選取 [非叢集索引…]。
在 [新增索引] 對話方塊,於 [一般] 頁面上的 [索引名稱] 方塊中輸入新索引的名稱。
選取 [索引鍵資料行] 下的 [新增...]。
在 [從table_name選取數據行] 對話框中,選取要加入至非叢集索引之數據表數據行的複選框或複選框。
選取 [確定]。
在 [新增索引] 對話方塊中,選取 [確定]。
使用 TRANSACT-SQL
若要使用 Transact-SQL 在資料表上建立非叢集索引
在 [物件總管] 中,連線到已安裝
AdventureWorks2022
的資料庫引擎執行個體。 可以從範例資料庫下載AdventureWorks2022
。在標準列上,選取 [新增查詢]。
複製下列範例並將其貼到查詢視窗中,然後選取 [執行]。
USE AdventureWorks2022; GO -- Find an existing index named IX_ProductVendor_VendorID and delete it if found. IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_ProductVendor_VendorID') DROP INDEX IX_ProductVendor_VendorID ON Purchasing.ProductVendor; GO -- Create a nonclustered index called IX_ProductVendor_VendorID -- on the Purchasing.ProductVendor table using the BusinessEntityID column. CREATE NONCLUSTERED INDEX IX_ProductVendor_VendorID ON Purchasing.ProductVendor (BusinessEntityID); GO