CREATE COLUMNSTORE INDEX (Transact-SQL)
对指定的表创建列存储索引。 “xVelocity 内存优化的列存储索引”是一种经过压缩的非聚集索引。 限制每个表只能有一个列存储索引。 可在表中先创建索引再创建数据。 无法更新具有列存储索引的表。 有关使用列存储索引的信息,请参阅列存储索引。
注意 |
---|
有关如何创建关系索引的信息,请参阅 CREATE INDEX (Transact-SQL)。 有关如何创建 XML 索引的信息,请参阅 CREATE XML INDEX (Transact-SQL)。 有关如何创建空间索引的信息,请参阅 CREATE SPATIAL INDEX (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。
- 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)
CREATE PARTITION FUNCTION (Transact-SQL)
CREATE PARTITION SCHEME (Transact-SQL)
sys.index_columns (Transact-SQL)