CREATE COLUMNSTORE INDEX (Transact-SQL)

对指定的表创建列存储索引。 “xVelocity 内存优化的列存储索引”是一种经过压缩的非聚集索引。 限制每个表只能有一个列存储索引。 可在表中先创建索引再创建数据。 无法更新具有列存储索引的表。 有关使用列存储索引的信息,请参阅列存储索引

注意注意

有关如何创建关系索引的信息,请参阅 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 不限于索引定义中的列。 在对列存储索引进行分区时,如果尚未指定分区依据列,则数据库引擎会添加分区依据列作为索引列。

    如果未指定 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)

概念

列存储索引

列存储索引