共用方式為


CREATE COLUMNSTORE INDEX (Transact-SQL)

在指定的資料表上建立資料行存放區索引。 「xVelocity 記憶體最佳化的資料行存放區索引」(xVelocity Memory Optimized Columnstore Index) 是壓縮、非叢集索引類型。 限制每個資料表最多一個資料行存放區索引。 可以在資料表中有資料之前建立索引。 具有資料行存放區索引的資料表無法更新。 如需有關使用資料行存放區索引的詳細資訊,請參閱<資料行存放區索引>。

[!附註]

如需有關如何建立關聯式索引的詳細資訊,請參閱<CREATE INDEX (Transact-SQL)>。 如需有關如何建立 XML 索引的詳細資訊,請參閱<CREATE XML INDEX (Transact-SQL)>。 如需有關如何建立空間索引的詳細資訊,請參閱<CREATE SPATIAL INDEX (Transact-SQL)>。

主題連結圖示 Transact-SQL 語法慣例

語法

CREATE [ NONCLUSTERED ] COLUMNSTORE INDEX index_name 
    ON <object> ( column  [ ,...n ] )
    [ WITH ( <column_index_option> [ ,...n ] ) ]
    [ ON {
           { partition_scheme_name ( column_name ) } 
           | filegroup_name 
           | "default" 
         }
    ]
[ ; ]

<object> ::=
{
    [database_name. [schema_name ] . | schema_name . ]
     table_name
{

<column_index_option> ::=
{
      DROP_EXISTING = { ON | OFF }
    | MAXDOP = max_degree_of_parallelism
 }

引數

  • NONCLUSTERED
    建立資料行存放區索引來指定資料表的邏輯排序。 不支援叢集資料行存放區索引。

  • COLUMNSTORE
    指出索引將會是資料行存放區索引。

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

  • column
    這是做為索引根據的資料行。 資料行存放區索引僅限於 1024 個資料行。

  • ON partition_scheme_name**(column_name)**
    指定資料分割配置來定義要做為資料分割索引之資料分割對應目標的檔案群組。 資料分割配置必須存在於資料庫中,方法是執行 CREATE PARTITION SCHEME。 column_name 會指定資料分割索引將進行資料分割的資料行。 此資料行必須符合 partition_scheme_name 所使用之資料分割函數引數的資料類型、長度與有效位數。 column_name 不限定為索引定義中的資料行。 對資料行存放區索引進行資料分割時,如果未指定資料分割資料行,Database Engine 會將它新增為索引的資料行。

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

    如需有關資料分割索引的詳細資訊,請參閱<分割資料表與索引>。

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

  • ON "default"
    在預設的檔案群組上建立指定的索引。

    在這個內容中,default 這個字不是關鍵字。 它是預設檔案群組的識別碼,必須加以分隔,例如 ON "default" 或 ON [default]。 如果指定了 "default",目前工作階段的 QUOTED_IDENTIFIER 選項就必須是 ON。 這是預設值。 如需詳細資訊,請參閱<SET QUOTED_IDENTIFIER (Transact-SQL)>。

<object>::=

這是要建立索引的完整或非完整物件。

  • database_name
    這是資料庫的名稱。

  • schema_name
    這是資料表所屬的結構描述名稱。

  • table_name
    這是要建立索引的資料表名稱。

<column_index_option>::=

指定當您建立資料行存放區索引時要使用的選項。

  • DROP_EXISTING
    指定要卸除及重建預先存在的具名索引。 預設值為 OFF。

    • ON
      卸除及重建現有的索引。 所指定的索引名稱必須與目前現有的索引相同;不過,索引定義可以修改。 例如,您可以指定不同的資料行或索引選項。
    • OFF
      如果所指定的索引名稱已存在,畫面上會出現錯誤。 您無法利用 DROP_EXISTING 來變更索引類型。 在與舊版本相容的語法中,WITH DROP_EXISTING 相當於 WITH DROP_EXISTING = ON。
  • MAXDOP = max_degree_of_parallelism
    針對索引作業持續時間覆寫 設定 max degree of parallelism 伺服器組態選項 組態選項。 請利用 MAXDOP 來限制執行平行計畫所用的處理器數目。 最大值是 64 個處理器。

    max_degree_of_parallelism 可以是:

    • 1
      隱藏平行計畫的產生。

    • >1
      根據目前的系統工作負載,將平行索引作業所使用的處理器數目上限,限制為所指定的數目或更少的數目。

    • 0 (預設值)
      根據目前的系統工作負載來使用實際數目的處理器或比實際數目更少的處理器。

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

    [!附註]

    並非 Microsoft SQL Server 的每個版本都無法使用平行索引作業。 如需 SQL Server 版本所支援功能的清單,請參閱<SQL Server 2012 版本支援的功能>。

備註

索引可以在暫存資料表上建立。 當資料表卸除或工作階段結束時,就會卸除索引。

一般商務資料類型可包含在資料行存放區索引中。 下列資料類型可包含在資料行存放區索引中。

  • char 及varchar

  • nchar 和 nvarchar (varchar(max) 和 nvarchar(max) 除外)

  • decimal (和 numeric) (有效位數大於 18 個位數的除外)

  • int、bigint、smallint 和 tinyint

  • float (和 real)

  • bit

  • money 和smallmoney

  • 所有日期和時間資料類型 (有效位數大於 2 的 datetimeoffset 除外)

下列資料類型不可包含在資料行存放區索引中。

  • binary 及varbinary

  • ntext、text 和 image

  • varchar(max) 和nvarchar(max)

  • uniqueidentifier

  • rowversion (和 timestamp)

  • sql_variant

  • 有效位數大於 18 個位數的 decimal (和 numeric)

  • 有效位數大於 2 的 datetimeoffset

  • CLR 類型 (hierarchyid 和空間類型)

  • xml

基本限制

資料行存放區索引:

  • 不能有 1024 個以上的資料行。

  • 不可叢集化。 只能使用非叢集資料行存放區索引。

  • 不能是唯一索引。

  • 無法在檢視表或索引檢視表上建立。

  • 不能包含疏鬆資料行。

  • 不可做為主索引鍵或外部索引鍵使用。

  • 無法使用 ALTER INDEX 陳述式加以變更。 請改為卸除並重新建立資料行存放區索引 (您可以使用 ALTER INDEX 停用並重建資料行存放區索引)。

  • 不可使用 INCLUDE 關鍵字來建立。

  • 不可包含 ASC 或 DESC 關鍵字排序索引。 資料行存放區索引是依據壓縮演算法來排序。 遞增或遞減排序會取消許多效能優點。

資料行存放區索引無法與下列功能結合:

  • 頁面和資料列壓縮,以及 vardecimal 儲存格式 (資料行存放區索引已使用不同格式壓縮)。

  • 複寫

  • 變更追蹤

  • 異動資料擷取

  • 檔案資料流

如需有關資料行存放區索引之效能優點和限制的詳細資訊,請參閱<資料行存放區索引>。

權限

需要資料表的 ALTER 權限。

範例

A.建立簡單的非叢集索引

下列範例會建立簡單資料表和叢集索引,然後示範建立資料行存放區索引的語法。

CREATE TABLE SimpleTable
(ProductKey [int] NOT NULL, 
OrderDateKey [int] NOT NULL, 
DueDateKey [int] NOT NULL, 
ShipDateKey [int] NOT NULL);
GO
CREATE CLUSTERED INDEX cl_simple ON SimpleTable (ProductKey);
GO
CREATE NONCLUSTERED COLUMNSTORE INDEX csindx_simple
ON SimpleTable
(OrderDateKey, DueDateKey, ShipDateKey);
GO

B.使用所有選項來建立簡單的非叢集索引

下列範例會建立簡單資料表和叢集索引,然後示範建立資料行存放區索引的語法。

CREATE NONCLUSTERED COLUMNSTORE INDEX csindx_simple
ON SimpleTable
(OrderDateKey, DueDateKey, ShipDateKey)
WITH (DROP_EXISTING =  ON, 
    MAXDOP = 2)
ON "default"
GO

如需使用資料分割資料表的較複雜範例,請參閱<資料行存放區索引>。

請參閱

參考

sys.column_store_dictionaries (Transact-SQL)

sys.column_store_segments (Transact-SQL)

ALTER INDEX (Transact-SQL)

CREATE PARTITION FUNCTION (Transact-SQL)

CREATE PARTITION SCHEME (Transact-SQL)

DROP INDEX (Transact-SQL)

sys.indexes (Transact-SQL)

sys.index_columns (Transact-SQL)

概念

資料行存放區索引

資料行存放區索引