共用方式為


CREATE INDEX (Transact-SQL)

適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

在資料表或檢視上建立關聯式索引。 也稱為資料列存放區索引,因為它是叢集或非叢集的 B 型樹狀結構索引。 您可以在資料表中含有資料之前,先建立資料列存放區索引。 特別是在查詢會從特定資料行中選取,或需要以特定順序排序值時,使用資料列存放區索引來改善查詢效能。

注意

文件通常會使用「B 型樹狀結構」一詞來指稱索引。 在資料列存放區索引中,資料庫引擎會實作 B+ 樹狀結構。 這不適用於資料行存放區索引或經記憶體最佳化的資料表。 如需詳細資訊,請參閱 SQL Server 和 Azure SQL 索引架構和設計指南

Azure Synapse Analytics 和 Analytics Platform System (PDW) 目前不支援唯一條件約束。 任何參考唯一條件約束的範例僅適用於 SQL Server、Azure SQL Database 和 Azure SQL 受控實例。

如需索引設計指導方針的相關信息,請參閱 SQL Server 索引設計指南

範例:

  1. 在資料表或檢視上建立非叢集索引

    CREATE INDEX index1 ON schema1.table1 (column1);
    
  2. 在資料表上建立叢集索引並為資料表使用 3 部分名稱

    CREATE CLUSTERED INDEX index1 ON database1.schema1.table1 (column1);
    
  3. 建立具有唯一條件約束的非叢集索引並指定排序次序

    CREATE UNIQUE INDEX index1 ON schema1.table1 (column1 DESC, column2 ASC, column3 DESC);
    

關鍵案例:

從 Azure SQL Database 和 Azure SQL 受控實例中的 SQL Server 2016 (13.x)開始,您可以在數據行存放區索引上使用非叢集索引來改善數據倉儲查詢效能。 如需詳細資訊,請參閱 數據行存放區索引 - 數據倉儲

針對其他索引類型,請參閱:

Transact-SQL 語法慣例

Syntax

SQL Server、Azure SQL Database、Azure SQL 受控執行個體的語法

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
    ON <object> ( column [ ASC | DESC ] [ ,...n ] )
    [ INCLUDE ( column_name [ ,...n ] ) ]
    [ WHERE <filter_predicate> ]
    [ WITH ( <relational_index_option> [ ,...n ] ) ]
    [ ON { partition_scheme_name ( column_name )
         | filegroup_name
         | default
         }
    ]
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]

[ ; ]

<object> ::=
{ database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }

<relational_index_option> ::=
{
    PAD_INDEX = { ON | OFF }
  | FILLFACTOR = fillfactor
  | SORT_IN_TEMPDB = { ON | OFF }
  | IGNORE_DUP_KEY = { ON | OFF }
  | STATISTICS_NORECOMPUTE = { ON | OFF }
  | STATISTICS_INCREMENTAL = { ON | OFF }
  | DROP_EXISTING = { ON | OFF }
  | ONLINE = { ON [ ( <low_priority_lock_wait> ) ] | OFF }
  | RESUMABLE = { ON | OFF }
  | MAX_DURATION = <time> [MINUTES]
  | ALLOW_ROW_LOCKS = { ON | OFF }
  | ALLOW_PAGE_LOCKS = { ON | OFF }
  | OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }
  | MAXDOP = max_degree_of_parallelism
  | DATA_COMPRESSION = { NONE | ROW | PAGE }
     [ ON PARTITIONS ( { <partition_number_expression> | <range> }
     [ , ...n ] ) ]
  | XML_COMPRESSION = { ON | OFF }
     [ ON PARTITIONS ( { <partition_number_expression> | <range> }
     [ , ...n ] ) ]
}

<filter_predicate> ::=
    <conjunct> [ AND ] [ ...n ]

<conjunct> ::=
    <disjunct> | <comparison>

<disjunct> ::=
        column_name IN (constant ,...n)

<comparison> ::=
        column_name <comparison_op> constant

<comparison_op> ::=
    { IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !< }

<low_priority_lock_wait>::=
{
    WAIT_AT_LOW_PRIORITY ( MAX_DURATION = <time> [ MINUTES ] ,
                          ABORT_AFTER_WAIT = { NONE | SELF | BLOCKERS } )
}

<range> ::=
<partition_number_expression> TO <partition_number_expression>

與舊版相容的關聯式索引

重要

SQL Server 未來的版本將會移除與舊版相容的關聯式索引語法結構。 請避免在新的開發工作中使用此語法結構,並規劃修改目前使用此功能的應用程式。 改為使用 <relational_index_option> 中指定的語法結構。

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
    ON <object> ( column_name [ ASC | DESC ] [ ,...n ] )
    [ WITH <backward_compatible_index_option> [ ,...n ] ]
    [ ON { filegroup_name | "default" } ]

<object> ::=
{
    [ database_name. [ owner_name ] . | owner_name. ]
    table_or_view_name
}

<backward_compatible_index_option> ::=
{
    PAD_INDEX
  | FILLFACTOR = fillfactor
  | SORT_IN_TEMPDB
  | IGNORE_DUP_KEY
  | STATISTICS_NORECOMPUTE
  | DROP_EXISTING
}

Azure Synapse Analytics 和平行處理資料倉儲的語法


CREATE CLUSTERED COLUMNSTORE INDEX index_name
    ON [ database_name . [ schema ] . | schema . ] table_name
    [ORDER (column[,...n])]
    [WITH ( DROP_EXISTING = { ON | OFF } )]
[;]


CREATE [ CLUSTERED | NONCLUSTERED ] INDEX index_name
    ON [ database_name . [ schema ] . | schema . ] table_name
        ( { column [ ASC | DESC ] } [ ,...n ] )
    WITH ( DROP_EXISTING = { ON | OFF } )
[;]

引數

UNIQUE

在資料表或檢視表上建立唯一索引。 在唯一索引中,任兩個資料列都不能有相同的索引鍵值。

Database Engine 不允許在已經包含重複值的數據行上建立唯一索引,無論是否 IGNORE_DUP_KEY 設定為 ON。 如果嘗試這樣做,Database Engine 會顯示錯誤訊息。 必須先移除重複值,才能在資料行上建立唯一索引。

UNIQUE條件約束會將 NULL 視為值。 如果數據行可為 Null,而且數據行上有條件 UNIQUE 約束,則最多允許一個具有 NULL 的數據列。

CLUSTERED

建立索引,其中為索引鍵數據行指定的排序順序會決定磁碟上索引結構中的頁面順序。 叢集索引底部或分葉頁面上的數據列一律包含數據表的所有數據行。 索引上層頁面上的數據列只包含索引鍵數據行。

資料表只能有一個叢集索引。 如果數據表上有叢集索引,它就會包含數據表中的所有數據。 沒有叢集索引的數據表稱為堆積。

含有唯一叢集索引的檢視表稱為索引檢視表。 索引檢視只能有一個叢集索引。 在檢視表上建立唯一叢集索引,可將檢視表實際具體化。 必須先在檢視表上建立唯一叢集索引,才能在相同檢視表上定義任何其他索引。 如需詳細資訊,請參閱建立索引檢視表

先建立叢集索引,再建立任何非叢集索引。 建立叢集索引時,會重建數據表上現有的非叢集索引,如果數據表很大,這是需要大量資源的作業。

如果未指定 CLUSTERED,就會建立非叢集索引。

注意

因為叢集索引包含數據表中的所有數據,因此建立叢集索引並使用 ON partition_scheme_nameON filegroup_name 子句,實際上會將數據表從建立數據表的檔案群組移至新的分割區配置或檔案群組。 在特定檔案群組上建立資料表或索引之前,請先確認檔案群組是可用的,而且它們有足夠的空間可供索引使用。

在某些情況下,建立叢集索引可以啟用先前停用的索引。 如需詳細資訊,請參閱 啟用索引和條件約束停用索引和條件約束

NONCLUSTERED

建立索引,其中為索引鍵數據行指定的排序順序會決定磁碟上索引結構中的頁面順序。 不同於叢集索引,非叢集索引分葉層級頁面上的數據列只包含索引鍵數據行。 或者,您可以使用 子句來 INCLUDE 包含非索引鍵數據行的子集。

不論索引的建立方式為何,每個數據表最多可以有999個非叢集索引:隱含使用 PRIMARY KEYUNIQUE 條件約束,或明確使用 CREATE INDEX

如果是索引檢視表,只能在已定義唯一叢集索引的檢視表上建立非叢集索引。

如果未指定,預設的索引類型為非叢集。

index_name

索引的名稱。 在資料表或檢視內,索引名稱必須是唯一,但在資料庫內就不一定要唯一。 索引名稱必須遵照識別碼的規則。

column

作為索引根據的一或多個資料行。 您可以指定兩個或兩個以上的資料行名稱,在指定之資料行的合計值上建立複合索引。 在 table_or_view_name 後面的括號內,依排序優先權順序列出要併入複合式索引的資料行。

單一複合式索引鍵中最多只能結合 32 個資料行。 複合索引鍵中的所有資料行都必須在相同的資料表或檢視表中。 針對叢集索引,組合索引值的允許大小上限是 900 個位元組,非叢集索引則為 1,700 個位元組。 針對 SQL Database 和 SQL Server 2016 (13.x) 之前的版本,限制為 16 個資料行和 900 個位元組。

屬於大型物件 (LOB) 資料類型 ntexttextvarchar(max)nvarchar(max)varbinary(max)xmlimage 的資料行,無法指定為索引的索引鍵資料行。 此外,索引檢視表定義不能包含 ntexttextimage 數據行,即使語句中 CREATE INDEX 未參考它們也一樣。

如果 CLR 使用者定義型別支援二進位排序,您可以在該型別的資料行上建立索引。 只要方法標示為確定性且不執行資料存取作業,您也可以在定義為使用者定義型別資料行方法引動過程的計算資料行上建立索引。 如需編製 CLR 使用者定義型別數據行索引的詳細資訊,請參閱 CLR 使用者定義型別

[ ASC | DESC ]

決定特定索引資料行的遞增或遞減排序方向。 預設值為 ASC

INCLUDE (column [ ,... n ] )

指定要加入至非叢集索引分葉層級的非索引鍵數據行。 非叢集索引可以是唯一或非唯一的。

無法在清單中重複 INCLUDE 數據行名稱,而且不能同時當做索引鍵和非索引鍵數據行使用。 如果數據表上定義了叢集索引,非叢集索引一律會隱含包含叢集索引數據行。 如需詳細資訊,請參閱 使用內含數據行建立索引

允許所有的資料類型,除了 textntextimage以外。 從 Azure SQL Database 和 Azure SQL 受控實例中的 SQL Server 2012 (11.x)開始,如果任何一個指定的非索引鍵數據行是 varchar(max)、nvarchar(max)varbinary(max) 數據類型,就可以使用 ONLINE 選項來建置或重建索引。

具決定性之精確或非精確的計算資料行都可以當做內含資料行。 衍生自 imagentexttextvarchar(max)nvarchar(max)varbinary(max)xml 數據類型的計算數據行,只要計算數據行數據類型可做為內含數據行即可包含。 如需詳細資訊,請參閱 計算資料行的索引

如需建立 XML 索引的資訊,請參閱 CREATE XML INDEX

WHERE <filter_predicate>

藉由指定要包含在已篩選之索引中的資料列來建立該索引。 已篩選的索引必須是資料表上的非叢集索引。 針對已篩選之索引中的資料列建立已篩選的統計資料。

篩選述詞使用簡單的比較邏輯,而且無法參考計算數據行、使用者定義數據類型 (UDT) 資料行、空間數據類型數據行或 hierarchyid 數據類型數據行。 不允許使用比較運算子與 NULL 常值的比較。 請改用 IS NULLIS NOT NULL 運算子。

下面是一些 Production.BillOfMaterials 資料表之篩選述詞的範例:

WHERE StartDate > '20000101' AND EndDate <= '20000630'

WHERE ComponentID IN (533, 324, 753)

WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL

已篩選的索引不適用於 XML 索引和全文檢索索引。 對於 UNIQUE 索引,只有選取的數據列必須有唯一的索引值。 已篩選的索引不允許 IGNORE_DUP_KEY 選項。

ON partition_scheme_name ( column_name )

指定資料分割配置,定義對應資料分割索引分割區的檔案群組。 透過執行 CREATE PARTITION SCHEMEALTER PARTITION SCHEME,讓資料分割配置一定會存在於資料庫內。 column_name 指定索引的數據分割數據行。 此資料行必須符合 partition_scheme_name 所使用資料分割函數引數的資料類型、長度與有效位數。 「column_name」不限定為索引定義中的資料行。 您可以指定基表中的任何數據行,但分割唯一索引時, column_name 必須從做為唯一索引鍵的索引鍵中選擇。 這項限制可讓資料庫引擎只在單一分割區內驗證索引鍵值的唯一性。

注意

當您分割一個非唯一的叢集索引時,如果尚未指定分割資料行,資料庫引擎預設會將它新增至叢集索引鍵清單。 當您分割一個非唯一的非叢集索引時,如果尚未指定分割資料行,資料庫引擎會將它新增為索引的非索引鍵 (內含) 資料行。

如果未指定「partition_scheme_name」或「filegroup」,且已分割資料表,則會使用相同的分割資料行,將索引放在與基礎資料表相同的資料分割配置中。

注意

您無法在 XML 索引上指定分割區配置。 如果基底資料表已分割,XML 索引會使用與資料表相同的分割區配置。

如需數據分割索引、 數據分割數據表和索引的詳細資訊。

ON filegroup_name

在指定的檔案群組上建立指定的索引。 如果未指定位置,且未分割資料表或檢視,則索引會使用與基礎資料表或檢視相同的檔案群組。 此檔案群組必須已存在。

ON [default]

在與資料表或檢視相同的檔案群組或分割區結構描述上建立所指定索引。

在此內容中,詞彙 default不是關鍵詞。 它是數據表或檢視表之檔案群組或數據分割配置的標識碼,而且必須以 或中的分隔ON "default"ON [default]符。 如果 "default" 已指定,則 QUOTED_IDENTIFIER 選項必須是 ON 目前會話的選項。 這是預設值。 如需詳細資訊,請參閱 SET QUOTED_IDENTIFIER

注意

在的內容中 CREATE INDEX"default"[default] 不會指出資料庫預設檔案群組。 它們表示基表或檢視所使用的檔案群組或分割區配置。 這不同於 CREATE TABLE,其中 "default"[default] 會將數據表放在資料庫預設檔案群組上。

[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]

指定在建立叢集索引時,資料表之 FILESTREAM 資料的位置。 FILESTREAM_ON 子句允許將 FILESTREAM 資料移到不同的 FILESTREAM 檔案群組或資料分割配置。

filestream_filegroup_name是 FILESTREAM 檔案群組的名稱。 此檔案群組必須有一個使用 CREATE DATABASEALTER DATABASE 陳述式針對此檔案群組定義的檔案,否則會引發錯誤。

如果分割此資料表,則必須包含 FILESTREAM_ON 子句,而且必須指定 FILESTREAM 檔案群組的分割區配置,此配置會使用與資料表的分割區配置相同的分割區函式和分割區資料行。 否則,就會引發錯誤。

如果未分割此資料表,就無法分割 FILESTREAM 資料行。 此資料表的 FILESTREAM 資料必須儲存在 FILESTREAM_ON 子句中指定的單一檔案群組內。

如果正在建立叢集索引,而且此資料表不包含 FILESTREAM 資料行,則可以在 FILESTREAM_ON NULL 陳述式中指定 CREATE INDEX

如需詳細資訊,請參閱 FILESTREAM (SQL Server)

<object>::=

要編製索引的完整或非完整物件。

database_name

資料庫的名稱。

schema_name

資料表或檢視所屬之結構描述的名稱。

table_or_view_name

要建立索引之資料表或檢視的名稱。

若要在檢視上建立索引,必須使用 定義 SCHEMABINDING檢視。 必須先在檢視表上建立唯一叢集索引,才能建立任何非叢集索引。 如需索引檢視的詳細資訊,請參閱

從 SQL Server 2016 (13.x) 開始,此物件可以是與叢集資料行存放區索引一併儲存的資料表。

<database_name>.<schema_name>.<object_name> 為目前資料庫名稱時,Azure SQL Database 支援三部分名稱格式 <database_name>,或 <database_name>tempdb,且 <object_name> 開頭為 ###。 如果架構名稱是 dbo,則可以省略 <schema_name>

<relational_index_option>::=

指定當您建立索引時所需使用的選項。

PAD_INDEX = { ON | OFF }

指定索引填補。 預設值為 OFF

  • 開啟

    填滿因數所指定的可用空間百分比會套用至索引的中繼層級頁面。 如果未同時指定 FILLFACTORPAD_INDEX 設定為 ON,則會使用 sys.indexes 中的填滿因數值

  • OFF

    中繼層級頁面會幾乎填滿整個容量,但會考量中繼頁面上的索引鍵集,而保留至少可供索引所能擁有之大小上限的一個資料列使用的足夠空間。 如果 PAD_INDEX 設定為 ON 但未指定填滿因數,也會發生這種情況。

PAD_INDEX只有在指定 時FILLFACTOR,此選項才有用,因為 PAD_INDEX 會使用 所FILLFACTOR指定的百分比。 如果指定的 FILLFACTOR 百分比不足以允許一個數據列,Database Engine 會在內部覆寫百分比以允許最小值。 中繼索引頁面上的數據列數目絕不小於兩個,不論的值 FILLFACTOR有多低。

在與舊版本相容的語法中,WITH PAD_INDEX 相當於 WITH PAD_INDEX = ON

FILLFACTOR = fillfactor

指定百分比,以表示 Database Engine 在索引建立或重建期間應該將每個索引頁面的分葉層級填滿的程度。 fillfactor 值必須是從 1 到 100 的整數值。 填滿因數值 0 和 100 在各方面都是一樣的。 如果「fillfactor」是 100,資料庫引擎會利用已填滿容量的分葉頁面來建立索引。

只有在建立或重新編製索引時才會套用 FILLFACTOR 設定。 資料庫引擎不會動態保留頁面中空白空間的指定百分比。

若要檢視填滿因數設定,請使用 fill_factorsys.indexes 目錄檢視中的數據行。

重要

建立 FILLFACTOR 小於 100 的索引會增加數據佔用的儲存空間量,因為 Database Engine 會在建立或重建索引時,根據填滿因數重新發佈數據。

如需詳細資訊,請參閱 指定索引的填滿因數

SORT_IN_TEMPDB = { ON | OFF }

指定是否要將暫存排序結果儲存在 tempdb中。 預設值為 OFF Azure SQL 資料庫 超大規模資料庫除外。 針對超大規模資料庫中的所有索引建置作業,除非使用可繼續的索引組建,否則一律會 SORT_IN_TEMPDBON。 針對可繼續的索引組建,SORT_IN_TEMPDB 一律會 OFF

  • 開啟

    用來建置索引的中繼排序結果會儲存在 中 tempdb。 這可能會縮短建立索引所需的時間。 不過,這會增加建立索引時所使用的磁碟空間量。

  • OFF

    中繼排序結果會儲存在與用來儲存索引相同的資料庫中。

除了用戶資料庫中建立索引所需的空間之外, tempdb 還必須有大約相同數量的額外空間來保存中繼排序結果。 如需詳細資訊,請參閱索引 SORT_IN_TEMPDB 選項。

在與舊版本相容的語法中,WITH SORT_IN_TEMPDB 相當於 WITH SORT_IN_TEMPDB = ON

IGNORE_DUP_KEY = { ON | OFF }

指定當插入作業嘗試將重複的索引鍵值插入唯一索引時所產生的錯誤回應。 IGNORE_DUP_KEY 選項只適用於在建立或重新編製索引之後所發生的插入作業。 執行 CREATE INDEXALTER INDEXUPDATE 時,這個選項沒有任何作用。 預設值為 OFF

  • 開啟

    當重複的索引鍵值插入唯一索引時,就會出現警告訊息。 只會插入違反唯一性條件約束的數據列。

  • OFF

    當重複的索引鍵值插入唯一索引時,就會出現錯誤訊息。 整個 INSERT 語句都會回復。

IGNORE_DUP_KEY 無法在檢視表、非唯一索引、XML 索引、空間索引和篩選索引上建立的索引設定為 ON

若要檢視索引的 IGNORE_DUP_KEY 設定,請使用 ignore_dup_key 目錄檢視中的 數據行。

在與舊版本相容的語法中,WITH IGNORE_DUP_KEY 相當於 WITH IGNORE_DUP_KEY = ON

STATISTICS_NORECOMPUTE = { ON | OFF}

指定是否重新計算統計數據。 預設值為 OFF

  • 開啟

    不會自動重新計算過期的統計資料。

  • OFF

    啟用自動統計資料更新。

若要還原自動統計資料更新,請將 STATISTICS_NORECOMPUTE 設為 OFF,或在不使用 UPDATE STATISTICS 子句的情況下執行 NORECOMPUTE

警告

如果您藉由設定 STATISTICS_NORECOMPUTE = ON來停用統計數據的自動重新計算,您可能會防止查詢優化器為涉及數據表的查詢挑選最佳執行計劃。

STATISTICS_NORECOMPUTE 設定為 ON,並不會防止在索引重建作業期間發生的索引統計數據更新。

在與舊版本相容的語法中,WITH STATISTICS_NORECOMPUTE 相當於 WITH STATISTICS_NORECOMPUTE = ON

STATISTICS_INCREMENTAL = { ON | OFF }

適用於:SQL Server 2014 (12.x) 和更新版本、Azure SQL Database 和 Azure SQL 受控實例

當 為 時 ON,所建立的統計數據是每個數據分割統計數據。 當 為 時 OFF,會卸除統計數據樹狀目錄,而 SQL Server 會重新計算統計數據。 預設值為 OFF

如果不支援每個分割區區的統計資料,則會忽略該選項,並產生警告。 在下列情況下不支援累加統計資料:

  • 建立統計資料時,所使用的索引未與基底資料表進行分割區對齊。
  • 在 AlwaysOn 可讀取次要資料庫上建立的統計資料。
  • 在唯讀資料庫上建立的統計資料。
  • 在篩選的索引上建立的統計資料。
  • 在檢視上建立的統計資料。
  • 在內部資料表上建立的統計資料。
  • 使用空間索引或 XML 索引建立的統計資料。

DROP_EXISTING = { ON | OFF }

這是一個選項,可用來卸除現有的叢集或非叢集索引,並使用已修改的資料行指定值來重建,並會維持相同的索引名稱。 預設值為 OFF

  • 開啟

    指定要卸除並重建現有索引,此索引的名稱必須與 index_name 參數相同。

  • OFF

    指定不要卸除並重建現有索引。 如果指定的索引名稱已存在,SQL Server 就會顯示錯誤。

使用 DROP_EXISTING,您可以變更:

  • 將非叢集資料列存放區索引變更為叢集資料列存放區索引。

使用 DROP_EXISTING,您無法變更:

  • 將叢集資料列存放區索引變更為非叢集資料列存放區索引。
  • 將叢集資料行存放區索引變更為任何類型的資料列存放區索引。

在與舊版本相容的語法中,WITH DROP_EXISTING 相當於 WITH DROP_EXISTING = ON

ONLINE = { ON | OFF }

指定在索引作業期間,查詢和資料修改是否能夠使用基礎資料表和相關聯的索引。 預設值為 OFF

重要

Microsoft SQL Server 的所有版本都無法使用線上索引作業。 如需 SQL Server 版本支援的功能清單,請參閱 SQL Server 2022 的版本和支援功能

  • 開啟

    索引作業持續期間不會保留長期資料表鎖定。 在索引作業的主要階段,源數據表上只會保留意圖共享 (IS) 鎖定。 這可使基礎資料表和索引的查詢或更新能夠進行。 作業開始時,來源物件上會保留一段短暫的共用(S)鎖定。 作業結束時,如果正在建立非叢集索引,則會在物件上取得共用 (S) 鎖定。 建立或卸除叢集索引時,以及重建叢集或非叢集索引時,會取得架構修改 (Sch-M) 鎖定。 ONLINE 在本機暫存表上建立索引時,無法設定為 ON

    注意

    您可以使用 [WAIT_AT_LOW_PRIORITY] 選項來減少或避免在在線索引作業期間封鎖。 如需詳細資訊,請參閱使用在線索引作業 WAIT_AT_LOW_PRIORITY

  • OFF

    在索引作業期間會套用資料表鎖定。 建立、重建或卸除叢集、空間或 XML 索引的離線索引作業,或重建或卸除非叢集索引,取得資料表上的架構修改 (Sch-M) 鎖定。 這可防止所有使用者在作業持續期間存取基礎資料表。 建立非叢集索引的離線索引作業一開始會取得數據表上的共用 (S) 鎖定。 這可防止修改基礎表定義,但允許在索引建置進行時讀取和修改數據表中的數據。

如需詳細資訊,請參閱 線上執行索引作業 和在線索引作業 指導方針

您可以在線上建立索引,其中包括全域暫存資料表的索引,但下列情況除外:

  • XML 索引
  • 本機暫存資料表上的索引
  • 在檢視上的初始唯一叢集索引
  • 停用的叢集索引
  • SQL Server 2017(14.x)和舊版中的叢集數據行存放區索引
  • SQL Server 2016(13.x)和舊版中的非叢集數據行存放區索引
  • 叢集索引 (如果基礎資料表包含 LOB 資料類型 (imagentexttext) 及空間類型)
  • varchar(max)varbinary(max) 資料行不得為索引鍵的一部分。 從 SQL Server 2012 (11.x)開始,在 Azure SQL Database 和 Azure SQL 受控實例中,當數據表包含 varchar(max)varbinary(max) 數據行時,可以使用 選項來建置或重建 ONLINE 包含其他數據行的叢集索引。
  • 具有叢集數據行存放區索引之數據表上的非叢集索引

如需詳細資訊,請參閱 在線索引作業的運作方式

RESUMABLE = { ON | OFF }

適用於:SQL Server 2019 (15.x) 和更新版本、Azure SQL Database 和 Azure SQL 受控實例

指定線上索引作業是否為可繼續的作業。 如需詳細資訊,請參閱 可繼續的索引作業可繼續的索引考慮

  • 開啟

    索引作業為可繼續的作業。

  • OFF

    索引作業不是可繼續的作業。

MAX_DURATION = time [MINUTES] 與 RESUMABLE = ON 搭配使用 (需要 ONLINE = ON)

適用於:SQL Server 2019 (15.x) 和更新版本、Azure SQL Database 和 Azure SQL 受控實例

指定在暫停之前,會執行可繼續索引作業的時間長度,以分鐘為單位。

ALLOW_ROW_LOCKS = { ON | OFF }

指定是否允許資料列鎖定。 預設值為 ON

  • 開啟

    當存取索引時,允許資料列鎖定。 資料庫引擎會決定使用資料列鎖定的時機。

  • OFF

    不使用資料列鎖定。

ALLOW_PAGE_LOCKS = { ON | OFF }

指定是否允許頁面鎖定。 預設值為 ON

  • 開啟

    當存取索引時,允許頁面鎖定。 資料庫引擎會決定使用頁面鎖定的時機。

  • OFF

    不使用頁面鎖定。

OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }

適用於:SQL Server 2019 (15.x) 和更新版本、Azure SQL Database 和 Azure SQL 受控實例

指定是否要優化以避免最後一頁插入爭用。 預設值為 OFF。 如需詳細資訊,請參閱 循序索引鍵 一節。

MAXDOP = max_degree_of_parallelism

覆寫索引作業 組態選項 平行處理原則的最大程度。 如需詳細資訊,請參閱 設定 max degree of parallelism 伺服器組態選項。 使用 MAXDOP 來限制平行處理原則的程度,以及索引建置作業所產生的資源耗用量。

max_degree_of_parallelism 可以是:

  • 1

    隱藏平行計畫的產生。

  • >1

    根據目前的系統工作負載,將平行索引作業中使用的平行處理原則程度上限限製為指定的數位或更少。

  • 0 (預設值)

    除非根據目前的系統工作負載減少,否則使用伺服器、資料庫或工作負載群組層級所指定的平行處理原則程度。

如需詳細資訊,請參閱 設定平行索引作業。

注意

並非所有 Microsoft SQL Server 版本都提供平行編製索引作業。 如需 SQL Server 版本支援的功能清單,請參閱 SQL Server 2022 的版本和支援功能

DATA_COMPRESSION

針對指定的索引、分割區編號或分割區範圍指定資料壓縮選項。 選項如下:

  • 不會壓縮索引或指定的資料分割。 這不適用於資料行存放區索引。

  • ROW

    使用資料列壓縮來壓縮索引或指定的分割區。 這不適用於資料行存放區索引。

  • PAGE

    使用頁面壓縮來壓縮索引或指定的分割區。 這不適用於資料行存放區索引。

  • COLUMNSTORE

    適用於:SQL Server 2014 (12.x) 和更新版本、Azure SQL Database 和 Azure SQL 受控實例

    只適用於資料行存放區索引,包括非叢集資料行存放區索引和叢集資料行存放區索引。

  • COLUMNSTORE_ARCHIVE

    適用於:SQL Server 2014 (12.x) 和更新版本、Azure SQL Database 和 Azure SQL 受控實例

    只適用於資料行存放區索引,包括非叢集資料行存放區索引和叢集資料行存放區索引。 COLUMNSTORE_ARCHIVE 進一步將指定的分割區壓縮為較小的大小。 這可用於封存,或是其他需要較小儲存體,而且可負擔更多時間來儲存和擷取的狀況。

如需壓縮的詳細資訊,請參閱資料壓縮 (機器翻譯)

XML_COMPRESSION

適用於:SQL Server 2022 (16.x) 和更新版本、Azure SQL Database 和 Azure SQL 受控實例

針對包含一或多個 xml 資料類型資料行的指定索引,指定 XML 壓縮選項。 選項如下:

  • 開啟

    使用 XML 壓縮來壓縮索引或指定的分割區。

  • OFF

    索引或指定的分割區不會使用 XML 壓縮進行壓縮。

ON PARTITIONS ( { <partition_number_expression> | <range> } [ ,...n ] )

指定套用 DATA_COMPRESSIONXML_COMPRESSION 設定的分割區。 如果未分割索引,自 ON PARTITIONS 變數會產生錯誤。 如果未提供 ON PARTITIONS 子句,DATA_COMPRESSIONXML_COMPRESSION 選項會套用到資料分割索引的所有分割區。

可以使用下列方式來指定 <partition_number_expression>

  • 提供分割區的編號,例如:ON PARTITIONS (2)
  • 為數個個別分割區提供以逗號分隔的分割區編號,例如:ON PARTITIONS (1, 5)
  • 同時提供範圍和個別分割區,例如:ON PARTITIONS (2, 4, 6 TO 8)

<range> 可以指定為以 關鍵詞 TO分隔的數據分割編號,例如: ON PARTITIONS (6 TO 8)

若要為不同的分割區設定不同類型的資料壓縮,請指定 DATA_COMPRESSION 選項一次以上,例如:

REBUILD WITH
(
DATA_COMPRESSION = NONE ON PARTITIONS (1),
DATA_COMPRESSION = ROW ON PARTITIONS (2, 4, 6 TO 8),
DATA_COMPRESSION = PAGE ON PARTITIONS (3, 5)
);

您也可以多次指定 XML_COMPRESSION 選項,例如:

REBUILD WITH
(
XML_COMPRESSION = OFF ON PARTITIONS (1),
XML_COMPRESSION = ON ON PARTITIONS (2, 4, 6 TO 8),
XML_COMPRESSION = OFF ON PARTITIONS (3, 5)
);

備註

建立語句的 CREATE INDEX 查詢計劃時,查詢優化器可能會選擇掃描另一個索引,而不是執行數據表掃描。 在某些情況下,可能會排除排序作業。 在多處理器計算機上, CREATE INDEX 可以使用平行處理原則來進行與建立索引相關聯的掃描和排序作業,就像其他查詢一樣。 如需詳細資訊,請參閱 設定平行索引作業。

CREATE INDEX如果資料庫恢復模式設定為大容量日誌或簡單,則作業可能會最低限度記錄。

索引可以在暫存資料表上建立。 卸除或超出範圍時,會卸除索引。

新增主鍵條件約束時,叢集索引會建置在數據表變數上。 同樣地,加入唯一條件約束時,非叢集索引會建置在數據表變數上。 當數據表變數超出範圍時,會卸除索引。

索引支援擴充屬性。

CREATE INDEX Microsoft Fabric 不支援。

叢集索引

若要在資料表 (堆積) 上建立叢集索引,或要卸除及重新建立現有的叢集索引,則資料庫中必須有可用的其他工作空間,才能容納資料排序和原始資料表或現有叢集索引資料的暫存複本。 如需叢集索引的詳細資訊,請參閱 建立叢集索引SQL Server 索引架構和設計指南

[非叢集索引]

從 Azure SQL Database 和 Azure SQL 受控實例中的 SQL Server 2016 (13.x)開始,您可以在儲存為叢集數據行存放區索引的數據表上建立非叢集索引。 如果您先在儲存為堆積或叢集索引的數據表上建立非叢集索引,則如果您稍後將數據表轉換成叢集數據行存放區索引,索引就會保存。 當您重建叢集資料行存放區索引時,也不需卸除非叢集索引。

當您在儲存為叢集資料行存放區索引的資料表上建立非叢集索引時,FILESTREAM_ON 選項無效。

唯一索引

當唯一索引存在時,Database Engine 會在每次新增或修改數據時檢查重複的值。 會產生重複索引鍵值的作業會回復,而 Database Engine 會傳回錯誤訊息。 即使數據新增或修改作業變更許多數據列,但只造成一個重複,也是如此。 如果嘗試在選項設定ON為 時插入數據列,則會忽略違反唯IGNORE_DUP_KEY一索引的數據列。

資料分割索引

分割區索引與分割區資料表的建立和維護方式類似,不過,跟一般索引一樣,分割區索引會當做個別資料庫物件來處理。 未分割的資料表上可以有資料分割索引;已分割的資料表上也可以有非資料分割索引。

如果您要在資料分割資料表上建立索引,且不指定要在其中放置索引的檔案群組,則索引的分割區方式與基礎資料表相同。 這是因為索引及其基礎資料表預設會置於同一個檔案群組內,且索引會供相同分割區配置中,使用相同分割區資料行的分割區資料表使用。 當索引使用與資料表相同的資料分割配置及分割資料行時,索引將會與資料表「對齊」。

警告

您可以對包含超過 1,000 個分割區的資料表,建立及重建不以資料表為準的索引,但不予支援。 此做法可能會導致在作業期間效能降低或耗用過多記憶體。 只有在分割區數目超過 1,000 時,才建議使用對齊的索引。

分割不是唯一的叢集索引時,若未指定分割資料行,資料庫引擎預設會將其加入叢集索引鍵清單。

您可以對分割區資料表建立索引檢視表,其方法與建立資料表索引相同。 如需數據分割索引的詳細資訊,請參閱 數據分割數據表和索引 ,以及 SQL Server 索引架構和設計指南

建立或重建索引時,查詢會優化索引的統計數據。 針對數據分割索引,查詢優化器會使用預設取樣演算法,而不是掃描數據表中的所有數據列以取得非分割索引。 若要在掃描資料表中所有資料列時取得分割區索引的統計資料,使用子句 CREATE STATISTICS 時請使用 UPDATE STATISTICSFULLSCAN

篩選的索引

已篩選的索引是最佳化的非叢集索引,適用於從資料表選取小型資料列百分比的查詢使用。 它會使用篩選述詞,針對資料表中的部分資料建立索引。 設計良好的已篩選索引可以提升查詢效能、降低儲存成本,並減少維護成本。

需要已篩選之索引的 SET 選項

SET每當發生下列任一情況時,[必要值] 資料行中的選項都是必要的:

  • 您可以建立篩選的索引。

  • INSERTUPDATEDELETEMERGE 語句會修改篩選索引中的數據。

  • 查詢最佳化工具會利用篩選索引來產生查詢計劃。

    SET 選項 必要值 預設伺服器值 預設 OLE DB 與 ODBC 值 預設 DB-Library 值
    ANSI_NULLS ON ON ON OFF
    ANSI_PADDING ON ON ON OFF
    ANSI_WARNINGS 1 ON ON ON OFF
    ARITHABORT ON ON OFF OFF
    CONCAT_NULL_YIELDS_NULL ON ON ON OFF
    NUMERIC_ROUNDABORT OFF OFF OFF OFF
    QUOTED_IDENTIFIER ON ON ON OFF

    1 當資料庫相容性層級設定ARITHABORTON為 90 或更新版本時,將 ANSI_WARNINGSON 設定為 隱含設定為 。 如果資料庫相容性層級設定為 80 或更早版本, ARITHABORT 則選項必須明確設定為 ON

SET如果選項不正確,可能會發生下列情況:

  • 建立篩選的索引失敗。
  • Database Engine 會產生錯誤,並回復INSERT變更索引中數據的 、 UPDATEDELETEMERGE 語句。
  • 查詢最佳化工具未針對任何 Transact-SQL 陳述式考量執行計畫中的索引。

如需已篩選索引的詳細資訊,請參閱 建立篩選的索引SQL Server 索引架構和設計指南

空間索引

如需空間索引的相關信息,請參閱 CREATE SPATIAL INDEXSpatial indexes overview

XML 索引

如需 XML 索引的資訊,請參閱 CREATE XML INDEX (機器翻譯)XML 索引 (SQL Server) (機器翻譯)

索引鍵大小

叢集索引的索引鍵大小上限為 900 個位元組,而非叢集索引為 1,700 個位元組 (SQL Database 和 SQL Server 2016 (13.x) 之前版本,限制一律為 900 個位元組。) 如果數據行中的現有數據未超過索引建立時的限制,可以建立超過位元組限制的 varchar 數據行索引;不過,導致總大小大於限制的數據行後續插入或更新作業失敗。 叢集索引的索引鍵不能包含配置單位中ROW_OVERFLOW_DATA現有數據的 varchar 數據行。 如果在 varchar 數據行上建立叢集索引,而且現有的數據位於配置單位中 IN_ROW_DATA ,則後續會在數據行上插入或更新作業,而該數據行上的後續插入或更新作業會讓數據非數據列失敗。

非叢集索引可以在索引的分葉層級中包含非索引鍵 (included) 資料行。 計算索引鍵大小時,Database Engine 不會考慮這些數據行。 如需詳細資訊,請參閱 使用內含 數據行建立 索引和 SQL Server 索引架構和設計指南

注意

分割資料表時,如果資料分割索引鍵資料行原本不存在非唯一的叢集索引中,資料庫引擎就會將它們加入至索引。 在非唯一的叢集索引中,索引資料行 (不計算包含的資料行) 再加上任何加入之分割區資料行的組合大小不得超過 1800 個位元組。

計算資料行

索引可以在計算資料行上建立。 此外,計算資料列可以有 屬性 PERSISTED。 這表示資料庫引擎會將計算值儲存在資料表中,並在更新計算資料行所根據的任何其他資料行時更新這些計算值。 當資料庫引擎在資料行上建立索引,且查詢中參考該索引時,它會使用這些保存的值。

若要為計算資料行建立索引,則計算資料行必須具確定性且精確。 不過,使用 PERSISTED 屬性會展開可編製索引計算數據行的類型,以包含:

  • 根據 Transact-SQL 和 CLR 函式及使用者標示為具確定性的 CLR 使用者定義型別方法所產生的計算資料行。
  • 根據具確定性 (如資料庫引擎所定義) 但不精確的運算式所產生的計算資料行。

保存的計算數據行需要設定下列 SET 選項,如上一節篩選 索引的必要 SET 選項所示。

UNIQUEPRIMARY KEY 條件約束只要符合索引編製的所有條件,就可以包含計算數據行。 更具體的說法是,計算資料行必須具決定性且精確,或是具決定性且一直保存。 如需確定性的詳細資訊,請參閱決定性與非決定性函數

imagentexttextvarchar(max)nvarchar(max)varbinary(max)xml 資料類型衍生的計算資料行,只要計算資料行資料類型可作為索引鍵資料行或非索引鍵資料行,就可編製索引以作為索引鍵或內含的非索引鍵資料行。 例如,您無法在計算的 xml 資料行上建立主要 XML 索引。 如果索引鍵大小超過 900 個位元組,畫面上會顯示警告訊息。

在計算數據行上建立索引可能會導致先前運作的插入或更新作業失敗。 當計算數據行產生算術錯誤時,可能會發生這類失敗。

例如,在下表中,雖然計算數據行 c 的表達式在插入數據列時,似乎會產生算術錯誤,但 INSERT 語句會運作。

CREATE TABLE t1 (a INT, b INT, c AS a/b);
INSERT INTO t1 VALUES (1, 0);

不過,如果您在計算數據行 c上建立索引,則相同的 INSERT 語句會失敗。

CREATE TABLE t1 (a INT, b INT, c AS a/b);
CREATE UNIQUE CLUSTERED INDEX Idx1 ON t1(c);
INSERT INTO t1 VALUES (1, 0);

如需詳細資訊,請參閱 計算資料行的索引

將資料行併入索引中

您可以將非索引鍵資料行 (稱為內含資料行) 加入至非叢集索引的分葉層級,以處理查詢來提升查詢效能。 換句話說,查詢中參考的所有資料行都會併入索引中當做索引鍵資料行或非索引鍵資料行。 這可讓查詢優化器從非叢集索引掃描或搜尋取得所有必要的資訊;無法存取資料表或叢集索引數據。 如需詳細資訊,請參閱 使用內含 數據行建立 索引和 SQL Server 索引架構和設計指南

指定索引選項

SQL Server 2005 (9.x) 引進了新的索引選項,並修改了指定選項的方式。 在回溯相容語法中, WITH option_name 相當於 WITH (option_name = ON)。 當您設定索引選項時,適用下列規則:

  • 只能利用 WITH (<option_name> = <ON | OFF>) 來指定新的索引選項。
  • 不能在相同的陳述式中,同時利用與舊版本相容的語法和新語法來指定選項。 例如,指定 WITH (DROP_EXISTING, ONLINE = ON) 會造成陳述式失敗。
  • 當您建立 XML 索引時,必須利用 WITH (<option_name> = <ON | OFF>) 來指定選項。

DROP_EXISTING 子句

您可以利用 DROP_EXISTING 子句來重新編製索引、新增或卸除資料行、修改選項、修改資料行排序次序,或變更資料分割配置或檔案群組。

如果索引強制執行 PRIMARY KEYUNIQUE 條件約束,而且索引定義不會以任何方式改變,則會卸除索引並重新建立,以保留現有的條件約束。 不過,如果索引定義變更了,陳述式就會失敗。 若要變更 或 UNIQUE 條件約束的定義PRIMARY KEY,請卸除條件約束,並使用新的定義新增條件約束。

當您在一份也有非叢集索引的資料表上,利用一組相同或不同的索引鍵來重新建立叢集索引時,DROP_EXISTING 可以增強效能。 DROP_EXISTING 會取代在舊叢集索引上執行 DROP INDEX 陳述式,然後再針對新叢集索引執行 CREATE INDEX 陳述式。 非叢集索引只重建一次,之後,只有在索引定義變更時才會再重建。 當索引定義的索引名稱、索引鍵資料行和分割區資料行、唯一性屬性及排序次序與原始索引相同時,DROP_EXISTING 子句不會重新編製非叢集索引。

不論非叢集索引是否重建,它們一律會保留在它們的原始檔案群組或分割區配置中,且會使用原始的分割區函數。 如果將叢集索引重建至不同的檔案群組或分割區配置中,則不會移動非叢集索引來符合叢集索引的新位置。 因此,即使先前與叢集索引對齊的非叢集索引,它們可能不再與叢集索引對齊。 如需數據分割索引對齊的詳細資訊,請參閱 分割數據表和索引

DROP_EXISTING如果相同的索引鍵數據行以相同順序使用,且具有相同遞增或遞減順序,則 子句不會再次排序數據,除非 index 語句指定非叢集索引,而且ONLINE選項設定為 OFF。 如果叢集索引已停用, CREATE INDEX WITH DROP_EXISTING 則必須使用 ONLINE 設定為 OFF來執行作業。 如果停用非叢集索引且未與已停用的叢集索引相關聯, CREATE INDEX WITH DROP_EXISTING 則可以使用 ONLINE 設定為 OFFON來執行作業。

注意

當卸除或重新編製含有 128 個 (含) 以上之範圍的索引時,資料庫引擎會延遲實際的頁面解除配置及其相關聯的鎖定,直到認可交易之後。 如需詳細資訊,請參閱 延遲解除分配

ONLINE 選項

以線上方式執行索引作業時,適用下列方針:

  • 當線上索引作業正在進行時,不能變更、截斷或卸除基礎資料表。
  • 在索引作業進行期間,需要其他暫存磁碟空間。
  • 線上作業可在下列索引上執行:分割區索引,以及包含保存的計算資料行或內含資料行的索引。
  • WAIT_AT_LOW_PRIORITY 變數選項可讓您決定索引作業在等候 Sch-M 鎖定時如何繼續。 如需詳細資訊,請參閱 WAIT_AT_LOW_PRIORITY

如需詳細資訊,請參閱 線上執行索引作業

可繼續的索引作業

適用於:SQL Server 2019 (15.x) 和更新版本、Azure SQL Database 和 Azure SQL 受控實例

您可以讓在線索引建立作業繼續執行。 這表示可以停止索引建置,稍後再從停止的點重新啟動。 若要以可繼續方式執行索引組建,請指定 RESUMABLE = ON 選項。

下列指導方針適用於可繼續的索引作業:

  • 若要使用 RESUMABLE 選項,您也必須使用 ONLINE 選項。
  • RESUMABLE 選項不會保存在指定索引的元數據中,而且僅適用於目前 DDL 語句的持續時間。 因此,必須明確指定 RESUMABLE = ON 子句,才能啟用可繼續性。
  • 您可以在兩個內容中指定 MAX_DURATION 選項:
    • MAX_DURATION RESUMABLE針對 選項,指定重建索引的時間間隔。 經過這個時間之後,如果索引重建仍在執行中,則會暫停。 您決定何時可以繼續重建暫停的索引。 MAX_DURATION 必須大於 0 分鐘,且小於或等於一周 (7 * 24 * 60 = 10080 分鐘)。 索引作業中的長時間暫停可能會明顯影響特定數據表上的 DML 效能,以及資料庫磁碟容量,因為原始索引和新建立的索引都需要磁碟空間,而且需要 DML 作業更新。 如果省略 MAX_DURATION 選項,索引作業會繼續直到完成或發生失敗為止。
    • MAX_DURATION 選項 WAIT_AT_LOW_PRIORITY 指定在採取動作之前,如果索引作業遭到封鎖,則等候使用低優先順序鎖定的時間。 如需詳細資訊,請參閱使用在線索引作業 WAIT_AT_LOW_PRIORITY
  • 若要立即暫停索引作業,您可以執行 ALTER INDEX PAUSE 命令,或執行 KILL <session_id> 命令。
  • 使用相同的參數重新執行原始 CREATE INDEX 語句會繼續暫停的索引建置作業。 您也可以執行 ALTER INDEX RESUME 語句,繼續暫停的索引建置作業。
  • ABORT 命令會終止執行索引組建的會話,並取消索引作業。 您無法繼續已中止的索引作業。

可繼續的索引作業會執行,直到它完成、暫停或失敗為止。 如果作業暫停,則會發出錯誤,指出作業已暫停,而且索引建立未完成。 如果作業失敗,也會發出錯誤。

若要查看索引作業是否以可繼續的作業的形式執行,以及檢查其目前的執行狀態,請使用 sys.index_resumable_operations 目錄檢視。

資源

可繼續索引作業需要下列資源:

  • 保留建置索引所需的額外空間,包括建置暫停的時間。
  • 進行排序階段時的額外記錄檔輸送量。 相較於一般線上索引建立,可繼續索引的整體記錄檔空間使用量較小,而且在此作業期間允許記錄截斷。
  • 不允許在索引作業暫停時,嘗試修改與所建立之索引相關聯的數據表的 DDL 語句。
  • 在作業暫停期間以及作業執行時,內建索引上都會封鎖準刪除清除。
  • 如果數據表包含 LOB 資料行,可繼續的叢集索引組建在作業開始時需要架構修改 (Sch-M) 鎖定。

目前的功能限制

可繼續的索引建立作業有下列限制:

  • 暫停可繼續的在線索引建立作業之後,無法變更 的初始值 MAXDOP
  • 可繼續索引作業不支援 SORT_IN_TEMPDB = ON 選項。
  • 具有 RESUMABLE = ON 的 DDL 命令無法在明確交易內執行。
  • 您無法建立包含下列專案的可繼續索引:
    • 計算或 timestamprowversion) 資料行作為索引鍵數據行。
    • LOB 資料行做為內含數據行。
  • 不支援可繼續的索引作業:
    • ALTER INDEX REBUILD ALL 命令
    • ALTER TABLE REBUILD 命令
    • 欄存儲索引
    • 篩選的索引
    • 已停用的索引

WAIT_AT_LOW_PRIORITY 與線上索引作業

適用於:SQL Server 2022 (16.x) 和更新版本、Azure SQL Database 和 Azure SQL 受控實例

當您不使用 WAIT_AT_LOW_PRIORITY 選項時,所有在數據表或索引上持有鎖定的作用中封鎖交易都必須完成,索引建立作業才能啟動和完成。 當在線索引作業開始且完成之前,它必須取得共用的(S)或架構修改(Sch-M)鎖定數據表,並加以保留一小段時間。 即使鎖定只保留一小段時間,也可能大幅影響工作負載輸送量、增加查詢延遲,或造成運行逾時。

為了避免這些問題,WAIT_AT_LOW_PRIORITY 選項可讓您管理在線索引作業啟動和完成所需的 SSch-M 鎖定行為,並從三個選項中選取。 在所有情況下,如果在 MAX_DURATION = n [minutes] 指定的等候時間期間,沒有牽涉到索引作業的封鎖,索引作業會立即繼續。

WAIT_AT_LOW_PRIORITY 讓在線索引作業使用低優先順序鎖定等候,讓其他作業同時使用一般優先順序鎖定繼續進行。 省略 WAIT_AT_LOW_PRIORITY 選項相當於 WAIT_AT_LOW_PRIORITY (MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE)

MAX_DURATION = 時間 [MINUTES]

在線索引作業使用低優先順序鎖定等候的等候時間(以分鐘為單位指定的整數值)。 如果作業在一段時間內遭到 MAX_DURATION 封鎖,則會執行指定的 ABORT_AFTER_WAIT 動作。 MAX_DURATION 時間一律以分鐘為單位,而且可以省略該字 MINUTES

ABORT_AFTER_WAIT = [NONE | SELF | BLOCKERS ]

  • NONE:繼續等候具有正常優先順序的鎖定。
  • SELF:結束目前正在執行的在線索引作業,而不採取任何動作。 SELF 為 0 時,無法使用選項 MAX_DURATION
  • BLOCKERS:終止封鎖在線索引作業的所有使用者交易,讓作業可以繼續。 BLOCKERS 選項需要執行 CREATE INDEXALTER INDEX 語句的主體具有 ALTER ANY CONNECTION 許可權。

您可以使用下列擴充事件來監視以低優先順序等候鎖定的索引作業:

  • lock_request_priority_state
  • process_killed_by_abort_blockers
  • ddl_with_wait_at_low_priority

資料列和頁面鎖定選項

如果 ALLOW_ROW_LOCKS = ONALLOW_PAGE_LOCK = ON,您存取索引時就允許資料列層級、頁面層級和資料表層級的鎖定。 資料庫引擎會選擇適當的鎖定,且可以將鎖定從資料列或頁面鎖定擴大到資料表鎖定。

如果 ALLOW_ROW_LOCKS = OFFALLOW_PAGE_LOCK = OFF,您存取索引時,只允許資料表層級的鎖定。

警告

不建議停用索引上的數據列或頁面鎖定。 可能會發生並行相關問題,而且某些功能可能無法使用。 例如,當 ALLOW_PAGE_LOCKS 設定為 OFF時,就無法重新組織索引。

循序索引鍵

適用於:SQL Server 2019 (15.x) 和更新版本、Azure SQL Database 和 Azure SQL 受控實例。

最後一頁的插入競爭是大量並行的執行緒在嘗試將資料列插入具備循序索引鍵的索引時,經常發生的一種效能問題。 當開頭的索引鍵資料行包含總是在增加 (或減少) 的值 (例如識別欄位或預設為目前日期/時間的日期) 時,便會將索引視為循序。 由於插入的索引鍵是循序的,因此所有新的數據列都會插入索引結構的結尾,換句話說,在相同的頁面上。 這會導致記憶體中頁面的爭用,這可以觀察到為數個線程等待取得有問題的頁面閂鎖。 對應的等候類型為 PAGELATCH_EX

啟用 OPTIMIZE_FOR_SEQUENTIAL_KEY 索引選項,可在能協助改善對索引進行高並行插入之輸送量的資料庫引擎內,啟用最佳化。 它適用於因具備循序索引鍵,而可能發生最後一頁插入競爭的索引,但它也可以協助在 B 型樹狀索引結構中其它區域內包含熱點的索引。

注意

文件通常會使用「B 型樹狀結構」一詞來指稱索引。 在資料列存放區索引中,資料庫引擎會實作 B+ 樹狀結構。 這不適用於資料行存放區索引或經記憶體最佳化的資料表。 如需詳細資訊,請參閱 SQL Server 和 Azure SQL 索引架構和設計指南

資料壓縮

如需數據壓縮的詳細資訊,請參閱 數據壓縮

以下是使用數據壓縮時,索引建置作業內容中要考慮的重點:

  • 壓縮可讓更多的資料列儲存在頁面上,但是不會變更最大資料列大小。
  • 索引的非分葉頁面不會進行頁面壓縮,但是可以進行資料列壓縮。
  • 每一個非叢集索引都有個別的壓縮設定,而且不會繼承基礎資料表的壓縮設定。
  • 在堆積上建立叢集索引時,此叢集索引會繼承堆積的壓縮狀態,除非指定了替代的壓縮狀態。

若要評估變更壓縮狀態如何影響數據表、索引或分割區的空間使用量,請使用 sp_estimate_data_compression_savings 預存程式。

XML 壓縮

適用於:SQL Server 2022 (16.x) 和更新版本、Azure SQL 資料庫,以及 Azure SQL 受控執行個體。

許多數據壓縮考慮適用於 XML 壓縮。 您應注意下列考量:

  • 當指定了分割區清單時,可以在個別分割區上啟用 XML 壓縮。 如果未指定分割區清單,則所有分割區都會設定為使用 XML 壓縮。 在建立資料表或索引時,除非另外指定,否則會停用 XML 資料壓縮。 在修改資料表時,除非另外指定,否則會保留現有的壓縮。
  • 如果您指定資料分割清單或超出範圍的資料分割,則會產生錯誤。
  • 在堆積上建立叢集索引時,此叢集索引會繼承堆積的 XML 壓縮狀態,除非指定了替代的壓縮選項。
  • 變更堆積的 XML 壓縮設定需要重新編製資料表上的所有非叢集索引,好讓它們擁有指向堆積內新資料列位置的指標。
  • 您可以在線上或離線時啟用或停用 XML 壓縮。 在堆積上啟用壓縮對於線上作業而言是單一執行緒的作業。
  • 若要判斷資料分割數據表中數據分割的 XML 壓縮狀態,請使用 xml_compression 目錄檢視的數據 sys.partitions 行。

索引統計數據

建立數據列存放區索引時,Database Engine 也會在索引的索引鍵數據行上建立 統計數據sys.stats 目錄檢視中的統計數據物件名稱符合索引的名稱。 針對非分割索引,統計數據是使用數據的完整掃描來建置。 針對數據分割索引,統計數據會使用預設取樣演算法來建置。

建立數據行存放區索引時,Database Engine 也會在 sys.stats 中建立統計數據物件。 此統計數據物件不包含統計數據數據,例如直方圖和密度向量。 建立資料庫複製時,會藉由編寫資料庫的腳本來使用。 屆時, DBCC SHOW_STATISTICSUPDATE STATISTICS ... WITH STATS_STREAM 命令可用來取得數據行存放區元數據,例如區段、字典和差異存放區大小,並將它新增至數據行存放區索引上的統計數據。 此元數據是在一般資料庫的查詢編譯時間動態取得,但是由資料庫複製的統計數據物件所提供。 任何其他案例中數據行存放區索引上的統計數據物件都不支援 UPDATE STATISTICS 命令。

權限

ALTER需要數據表或檢視表或固定資料庫角色成員資格的許可權db_ddladmin

限制事項

在 Azure Synapse Analytics 和 Analytics Platform System (PDW) 中,您無法建立:

  • 當資料行存放區索引已存在時,無法在資料倉儲資料表上建立叢集或非叢集資料列存放區索引。 此行為與 SMP SQL Server 不同,後者可讓資料列存放區索引和資料行存放區索引共存於相同的資料表上。
  • 您無法在檢視上建立索引。

中繼資料

若要檢視現有索引的資訊,您可以查詢 sys.indexes 目錄檢視。

版本注意事項

  • Azure SQL Database 不支援 PRIMARY以外的檔案群組。
  • Azure SQL Database 和 Azure SQL 受控實例不支援 FILESTREAM 選項。
  • SQL Server 2012 (11.x) 之前無法使用資料行存放區索引。
  • 從 SQL Server 2017 (14.x)、Azure SQL Database 和 Azure SQL 受控實例開始,即可使用可繼續的索引作業。

範例:所有版本。 使用 AdventureWorks 資料庫

A. 建立簡單的非叢集資料列存放區索引

下列範例會在 VendorID 資料表的 Purchasing.ProductVendor 資料行上建立非叢集索引。

CREATE INDEX IX_VendorID ON ProductVendor (VendorID);
CREATE INDEX IX_VendorID ON dbo.ProductVendor (VendorID DESC, Name ASC, Address DESC);
CREATE INDEX IX_VendorID ON Purchasing..ProductVendor (VendorID);

B. 建立簡單的非叢集資料列存放區複合式索引

下列範例會在 SalesQuota 資料表的 SalesYTDSales.SalesPerson 資料行上建立非叢集複合式索引。

CREATE NONCLUSTERED INDEX IX_SalesPerson_SalesQuota_SalesYTD ON Sales.SalesPerson (SalesQuota, SalesYTD);

C. 在另一個資料庫的資料表上建立索引

下列範例會在 VendorID 資料庫中 ProductVendor 資料表的 Purchasing 資料行上建立叢集索引。

CREATE CLUSTERED INDEX IX_ProductVendor_VendorID ON Purchasing..ProductVendor (VendorID);

D. 將資料行加入至索引

下列範例會使用 dbo.FactFinance 資料表的兩個資料行建立索引 IX_FF。 下一個陳述式會使用多個資料行重建索引,並保留現有的名稱。

CREATE INDEX IX_FF ON dbo.FactFinance (FinanceKey ASC, DateKey ASC);

-- Rebuild and add the OrganizationKey
CREATE INDEX IX_FF ON dbo.FactFinance (FinanceKey, DateKey, OrganizationKey DESC)
  WITH (DROP_EXISTING = ON);

範例:SQL Server、Azure SQL Database

E. 建立唯一的非叢集索引

下列範例會在 Name 資料庫中 Production.UnitMeasure 資料表的 AdventureWorks2022 資料行上建立唯一非叢集索引。 索引會強制將資料上的唯一性插入 Name 資料行中。

CREATE UNIQUE INDEX AK_UnitMeasure_Name
  ON Production.UnitMeasure(Name);

下列查詢會藉由嘗試插入與現有資料列具有相同值的資料列,以測試條件約束的唯一性。

-- Verify the existing value.
SELECT Name FROM Production.UnitMeasure WHERE Name = N'Ounces';
GO

INSERT INTO Production.UnitMeasure (UnitMeasureCode, Name, ModifiedDate)
  VALUES ('OC', 'Ounces', GETDATE());

產生的錯誤訊息如下:

Server: Msg 2601, Level 14, State 1, Line 1
Cannot insert duplicate key row in object 'UnitMeasure' with unique index 'AK_UnitMeasure_Name'. The statement has been terminated.

F. 使用 IGNORE_DUP_KEY 選項

下列範例分別利用兩種不同的選項設定 (先將選項設為 IGNORE_DUP_KEY,再將選項設為 ON) 將多個資料列插入暫存資料表中,示範 OFF 選項的效果。 單一資料列會插入 #Test 資料表中,該資料表則會在第二個多重資料列 INSERT 陳述式執行時刻意造成重複的值。 資料表中的資料列計數會傳回所插入的資料列數目。

CREATE TABLE #Test (C1 NVARCHAR(10), C2 NVARCHAR(50), C3 DATETIME);
GO

CREATE UNIQUE INDEX AK_Index ON #Test (C2)
  WITH (IGNORE_DUP_KEY = ON);
GO

INSERT INTO #Test VALUES (N'OC', N'Ounces', GETDATE());
INSERT INTO #Test SELECT * FROM Production.UnitMeasure;
GO

SELECT COUNT(*) AS [Number of rows] FROM #Test;
GO

DROP TABLE #Test;
GO

以下是第二個 INSERT 陳述式的結果。

Server: Msg 3604, Level 16, State 1, Line 5 Duplicate key was ignored.

Number of rows
--------------
38

請注意,從 Production.UnitMeasure 資料表插入之未違反唯一性條件約束的資料列已順利插入。 發出警告且忽略重複的資料列,但不回復整個交易。

重新執行相同的陳述式,但將 IGNORE_DUP_KEY 設為 OFF

CREATE TABLE #Test (C1 NVARCHAR(10), C2 NVARCHAR(50), C3 DATETIME);
GO

CREATE UNIQUE INDEX AK_Index ON #Test (C2)
  WITH (IGNORE_DUP_KEY = OFF);
GO

INSERT INTO #Test VALUES (N'OC', N'Ounces', GETDATE());
INSERT INTO #Test SELECT * FROM Production.UnitMeasure;
GO

SELECT COUNT(*) AS [Number of rows] FROM #Test;
GO

DROP TABLE #Test;
GO

以下是第二個 INSERT 陳述式的結果。

Server: Msg 2601, Level 14, State 1, Line 5
Cannot insert duplicate key row in object '#Test' with unique index
'AK_Index'. The statement has been terminated.

Number of rows
--------------
1

請注意,即便 Production.UnitMeasure 資料表只有一個資料列違反 UNIQUE 索引條件約束,皆會導致資料表中所有的資料列無法插入資料表。

G. 使用 DROP_EXISTING 卸除及重新建立索引

下列範例會利用 ProductID 選項,在 Production.WorkOrder 資料庫中 AdventureWorks2022 資料表的 DROP_EXISTING 資料行上卸除及重新建立現有的索引。 也會設定 FILLFACTORPAD_INDEX 選項。

CREATE NONCLUSTERED INDEX IX_WorkOrder_ProductID
  ON Production.WorkOrder(ProductID)
    WITH (FILLFACTOR = 80,
      PAD_INDEX = ON,
      DROP_EXISTING = ON);
GO

H. 在檢視表上建立索引

下列範例會在該檢視表上建立檢視表和索引。 內含使用索引檢視的兩項查詢。

-- Set the options to support indexed views
SET NUMERIC_ROUNDABORT OFF;
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT,
  QUOTED_IDENTIFIER, ANSI_NULLS ON;
GO

-- Create view with schemabinding
IF OBJECT_ID ('Sales.vOrders', 'view') IS NOT NULL
  DROP VIEW Sales.vOrders;
GO

CREATE VIEW Sales.vOrders
  WITH SCHEMABINDING
AS
  SELECT SUM(UnitPrice * OrderQty * (1.00 - UnitPriceDiscount)) AS Revenue,
    OrderDate, ProductID, COUNT_BIG(*) AS COUNT
  FROM Sales.SalesOrderDetail AS od, Sales.SalesOrderHeader AS o
  WHERE od.SalesOrderID = o.SalesOrderID
  GROUP BY OrderDate, ProductID;
GO

-- Create an index on the view
CREATE UNIQUE CLUSTERED INDEX IDX_V1
  ON Sales.vOrders (OrderDate, ProductID);
GO

-- This query can use the indexed view even though the view is
-- not specified in the FROM clause.
SELECT SUM(UnitPrice * OrderQty * (1.00 - UnitPriceDiscount)) AS Rev,
  OrderDate, ProductID
FROM Sales.SalesOrderDetail AS od
  JOIN Sales.SalesOrderHeader AS o ON od.SalesOrderID = o.SalesOrderID
    AND ProductID BETWEEN 700 AND 800
    AND OrderDate >= CONVERT(DATETIME, '05/01/2002', 101)
GROUP BY OrderDate, ProductID
ORDER BY Rev DESC;
GO

-- This query can use the above indexed view
SELECT OrderDate, SUM(UnitPrice * OrderQty * (1.00 - UnitPriceDiscount)) AS Rev
FROM Sales.SalesOrderDetail AS od
  JOIN Sales.SalesOrderHeader AS o ON od.SalesOrderID = o.SalesOrderID
    AND DATEPART(mm, OrderDate) = 3
  AND DATEPART(yy, OrderDate) = 2002
GROUP BY OrderDate
ORDER BY OrderDate ASC;
GO

I. 使用內含的 (非索引鍵) 資料行建立索引

下列範例會利用一個索引鍵資料行 (PostalCode) 和四個非索引鍵資料行 (AddressLine1AddressLine2CityStateProvinceID) 來建立非叢集索引。 其後有一個由索引處理的查詢。 若要顯示查詢最佳化工具選取的索引,請先在 SQL Server Management Studio 的 [查詢] 功能表上選取 [顯示實際執行計畫],然後再執行查詢。

CREATE NONCLUSTERED INDEX IX_Address_PostalCode
  ON Person.Address (PostalCode)
  INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);
GO

SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCode
FROM Person.Address
WHERE PostalCode BETWEEN N'98000' and N'99999';
GO

J. 建立資料分割索引

下列範例會在 TransactionsPS1 資料庫中現有的分割區配置 AdventureWorks2022 上建立非叢集分割區索引。 此範例假設您已安裝分割區索引範例。

CREATE NONCLUSTERED INDEX IX_TransactionHistory_ReferenceOrderID
  ON Production.TransactionHistory (ReferenceOrderID)
  ON TransactionsPS1 (TransactionDate);
GO

K. 建立篩選的索引

下列範例會對 AdventureWorks2022 資料庫中的 Production.BillOfMaterials 資料表建立篩選的索引。 篩選述詞可以包含在已篩選之索引中不是索引鍵資料行的資料行。 此範例中的述詞只會選取 EndDate 不是 NULL 的資料列。

CREATE NONCLUSTERED INDEX "FIBillOfMaterialsWithEndDate"
  ON Production.BillOfMaterials (ComponentID, StartDate)
  WHERE EndDate IS NOT NULL;

L. 建立壓縮索引

下列範例會使用資料列壓縮,在非分割區資料表上建立索引。

CREATE NONCLUSTERED INDEX IX_INDEX_1
  ON T1 (C2)
  WITH (DATA_COMPRESSION = ROW);
GO

下列範例會在索引的所有分割區上使用資料列壓縮,以便在分割區資料表上建立索引。

CREATE CLUSTERED INDEX IX_PartTab2Col1
  ON PartitionTable1 (Col1)
  WITH (DATA_COMPRESSION = ROW);
GO

下列範例會在分割區資料表上建立索引,其方式是在索引的分割區 1 上使用頁面壓縮,並在索引的分割區 24 上使用資料列壓縮。

CREATE CLUSTERED INDEX IX_PartTab2Col1
  ON PartitionTable1 (Col1)
  WITH (
    DATA_COMPRESSION = PAGE ON PARTITIONS(1),
    DATA_COMPRESSION = ROW ON PARTITIONS (2 TO 4)
  );
GO

M. 使用 XML 壓縮建立索引

適用於:SQL Server 2022 (16.x) 和更新版本、Azure SQL 資料庫,以及 Azure SQL 受控執行個體。

下列範例會使用 XML 壓縮,在非資料分割資料表上建立索引。 索引中至少需有一個資料行是 xml 資料類型。

CREATE NONCLUSTERED INDEX IX_INDEX_1
  ON T1 (C2)
  WITH (XML_COMPRESSION = ON);
GO

下列範例會在索引的所有分割區上使用 XML 壓縮,以便在資料分割資料表上建立索引。

CREATE CLUSTERED INDEX IX_PartTab2Col1
  ON PartitionTable1 (Col1)
  WITH (XML_COMPRESSION = ON);
GO

N. 建立、繼續、暫停及中止可繼續的索引作業

適用於:SQL Server 2019 (15.x) 和更新版本、Azure SQL Database 和 Azure SQL 受控實例

-- Execute a resumable online index create statement with MAXDOP=1
CREATE INDEX test_idx1 ON test_table (col1) WITH (ONLINE = ON, MAXDOP = 1, RESUMABLE = ON);

-- Executing the same command again (see above) after an index operation was paused, resumes automatically the index create operation.

-- Execute a resumable online index creates operation with MAX_DURATION set to 240 minutes. After the time expires, the resumable index create operation is paused.
CREATE INDEX test_idx2 ON test_table (col2) WITH (ONLINE = ON, RESUMABLE = ON, MAX_DURATION = 240);

-- Pause a running resumable online index creation
ALTER INDEX test_idx1 ON test_table PAUSE;
ALTER INDEX test_idx2 ON test_table PAUSE;

-- Resume a paused online index creation
ALTER INDEX test_idx1 ON test_table RESUME;
ALTER INDEX test_idx2 ON test_table RESUME;

-- Abort resumable index create operation which is running or paused
ALTER INDEX test_idx1 ON test_table ABORT;
ALTER INDEX test_idx2 ON test_table ABORT;

O. 具有不同低優先順序鎖定選項的 CREATE INDEX

下列範例會使用 WAIT_AT_LOW_PRIORITY 選項,指定不同的處理封鎖策略。

--Kill this session after waiting 5 minutes
CREATE CLUSTERED INDEX idx_1 ON dbo.T2 (a) WITH (ONLINE = ON (WAIT_AT_LOW_PRIORITY (MAX_DURATION = 5 MINUTES, ABORT_AFTER_WAIT = SELF)));
GO
--Kill blocker sessions
CREATE CLUSTERED INDEX idx_1 ON dbo.T2 (a) WITH (ONLINE = ON (WAIT_AT_LOW_PRIORITY (MAX_DURATION = 5 MINUTES, ABORT_AFTER_WAIT = BLOCKERS)));
GO

下列範例會同時使用 RESUMABLE 選項並指定兩個 MAX_DURATION 值,第一個值會套用至 ABORT_AFTER_WAIT 選項,第二個則套用至 RESUMABLE 選項。

--With resumable option; default locking behavior 
CREATE CLUSTERED INDEX idx_1 ON dbo.T2 (a) WITH (ONLINE = ON (WAIT_AT_LOW_PRIORITY (MAX_DURATION = 5 MINUTES, ABORT_AFTER_WAIT = NONE)), RESUMABLE = ON, MAX_DURATION = 240 MINUTES);

範例:Azure Synapse Analytics 和 Analytics Platform System (PDW)

P. 基本語法

建立、繼續、暫停及中止可繼續的索引作業

適用於:SQL Server 2019 (15.x) 和更新版本、Azure SQL Database 和 Azure SQL 受控實例

-- Execute a resumable online index create statement with MAXDOP=1
CREATE INDEX test_idx ON test_table WITH (ONLINE = ON, MAXDOP = 1, RESUMABLE = ON);

-- Executing the same command again (see above) after an index operation was paused, resumes automatically the index create operation.

-- Execute a resumable online index creates operation with MAX_DURATION set to 240 minutes. After the time expires, the resumable index create operation is paused.
CREATE INDEX test_idx ON test_table WITH (ONLINE = ON, RESUMABLE = ON, MAX_DURATION = 240);

-- Pause a running resumable online index creation
ALTER INDEX test_idx ON test_table PAUSE;

-- Resume a paused online index creation
ALTER INDEX test_idx ON test_table RESUME;

-- Abort resumable index create operation which is running or paused
ALTER INDEX test_idx ON test_table ABORT;

問。 在目前資料庫的資料表上建立非叢集索引

下列範例會在 VendorID資料表的 ProductVendor 資料行上建立非叢集索引。

CREATE INDEX IX_ProductVendor_VendorID
  ON ProductVendor (VendorID);

R. 在另一個資料庫的資料表上建立叢集索引

下列範例會在 VendorID 資料庫中 ProductVendor 資料表的 Purchasing 資料行上建立非叢集索引。

CREATE CLUSTERED INDEX IX_ProductVendor_VendorID
  ON Purchasing..ProductVendor (VendorID);

S. 在資料表上建立已排序的叢集索引

下列範例會在 c1 資料庫中 c2 資料表的 T1MyDB 資料行上建立已排序叢集索引。

CREATE CLUSTERED COLUMNSTORE INDEX MyOrderedCCI ON MyDB.dbo.T1 
ORDER (c1, c2);

T. 在資料表上將 CCI 轉換成已排序的叢集索引

下列範例會將現有叢集資料行存放區索引轉換成已排序的叢集資料行存放區索引,其稱為 MyOrderedCCI (位於 c1 資料庫中 c2 資料表的 T2MyDB 資料行)。

CREATE CLUSTERED COLUMNSTORE INDEX MyOrderedCCI ON MyDB.dbo.T2
ORDER (c1, c2)
WITH (DROP_EXISTING = ON);