共用方式為


建立內含數據行的索引

本主題描述如何使用 SQL Server Management Studio 或 Transact-SQL,新增包含的(或非索引鍵)數據行,以擴充 SQL Server 2014 中非叢集索引的功能。 藉由加入非索引鍵資料行,您可以建立涵蓋更多查詢的非叢集索引。 這是因為非鍵欄位有以下好處:

  • 它們可以是不可用作索引鍵資料行的資料類型。

  • 計算索引鍵資料行數或索引鍵大小時,資料庫引擎不會加以考慮。

當查詢中的所有資料行作為鍵或非鍵資料行包含在索引中時,包含非鍵資料行的索引可以顯著提高查詢效能。 因為查詢最佳化工具可以在索引中找到所有資料行值,所以可以提高效能;不存取資料表或叢集索引資料,導致磁碟 I/O 作業變少。

備註

當索引包含查詢所參考的所有資料行時,通常稱作「覆蓋查詢」。

本主題內容

開始之前

設計建議

  • 重新設計具有大型索引鍵大小的非叢集索引,如此僅有用於搜尋與查閱的資料行才會是索引鍵資料行。 讓涵蓋查詢的所有其他資料行都做為非索引鍵資料行。 如此一來,您將擁有涵蓋查詢所需的所有資料行,但是索引鍵本身會變得很小而且很有效率。

  • 在非叢集索引中包含非索引鍵數據行,以避免超過 16 個索引鍵數據行的目前索引大小限制,以及 900 個字節的索引鍵大小上限。 計算索引鍵資料行數或索引鍵大小時,資料庫引擎不會考慮非索引鍵之索引資料行。

限制與制約

  • 非鍵值欄位只能在非叢集索引上定義。

  • 除了 、 ntextimage 以外的text所有資料類型,都可以當做非索引鍵數據行使用。

  • 具決定性且精確或非精確的計算資料行可以是非索引鍵資料行。 如需詳細資訊,請參閱 計算資料行的索引

  • 只要計算數據列的數據類型允許作為非鍵索引列,衍生自 imagentexttext 數據類型的計算數據列就可以是非鍵列。

  • 除非先刪除該資料表的索引,否則無法從資料表刪除非主鍵欄位。

  • 除非執行下列動作,否則無法變更非索引鍵之索引資料行:

    • 將資料行的可空性從 NOT NULL 變更為 NULL。

    • 增加、 varcharnvarchar 資料行的varbinary長度。

安全

權限

需要擁有對資料表或檢視表的 ALTER 權限。 使用者必須是 系統管理員 固定伺服器角色的成員,或是 db_ddladmindb_owner 固定資料庫角色的成員。

使用 SQL Server Management Studio

建立具有非索引鍵數據行的索引

  1. 在 [物件總管] 中,按兩下加號展開資料庫,其中包含您要在其中建立具有非索引鍵數據行的數據表。

  2. 按一下加號展開 [資料表] 資料夾。

  3. 單擊加號以展開您要在其上建立非主鍵列索引的表格。

  4. 以滑鼠右鍵按一下 [索引] 資料夾,指向 [新增索引],然後選取 [非叢集索引…]。

  5. [新增索引] 對話方塊,於 [一般] 頁面上的 [索引名稱] 方塊中輸入新索引的名稱。

  6. 索引鍵欄 索引標籤下,按一下 新增...

  7. 在 [table_name選取數據行] 對話框中,選取要新增至索引之數據表數據行的複選框或複選框。

  8. 按一下 [確定]

  9. 包含的欄位 標籤中,點擊 新增...

  10. [從 table_name選取資料行] 對話方塊,選取要加入索引作為非索引鍵資料行的一或多個資料表資料行核取方塊。

  11. 按一下 [確定]

  12. [新增索引] 對話方塊中,按一下 [確定]

使用 Transact-SQL

建立具有非鍵列的索引

  1. 物件總管中,連線到資料庫引擎實例。

  2. 在標準列上,按一下 [新增查詢]

  3. 複製下列範例並將其貼到查詢視窗中,然後按一下 [執行]

    USE AdventureWorks2012;  
    GO  
    -- Creates a nonclustered index on the Person.Address table with four included (nonkey) columns.   
    -- index key column is PostalCode and the nonkey columns are  
    -- AddressLine1, AddressLine2, City, and StateProvinceID.  
    CREATE NONCLUSTERED INDEX IX_Address_PostalCode  
    ON Person.Address (PostalCode)  
    INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);  
    GO  
    

如需更多資訊,請參閱 CREATE INDEX (Transact-SQL)