列具有无法参与列存储索引的数据类型

Posted

技术标签:

【中文标题】列具有无法参与列存储索引的数据类型【英文标题】:Column has a data type that cannot participate in a columnstore index 【发布时间】:2021-11-22 12:03:25 【问题描述】:

我想使用以下查询在表中创建聚集列存储索引:

CREATE CLUSTERED COLUMNSTORE INDEX cci
ON agl_20180319_bck

我收到了这个错误:

消息 35343,第 16 级,状态 1,第 6 行 声明失败。列“memberOf”的数据类型不能参与列存储索引。省略列“memberOf”。

“memberOf”属于这种类型:memberOf nvarchar(max)

如何克服/忽略这个错误,它是什么意思?

【问题讨论】:

【参考方案1】:

只需指定 varchar 变量的长度,而不是使用最大值。对我有用!

【讨论】:

【参考方案2】:

根据documentation:

使用以下任何数据类型的列不能包含在 列存储索引:

nvarchar(max)、varchar(max) 和 varbinary(max)(适用于 SQL Server 2016 及之前的版本,以及非聚集列存储索引)

要么更改列的类型(如果可以),要么在此特定列上没有列存储索引。

【讨论】:

这意味着我必须创建一个非聚集列存储索引? 不,这意味着您根本无法在该列上创建列存储索引。您可以尝试将类型从 nvarchar(max) 更改以对其进行限制,例如将长度设置为 4000。然后您可以在其上创建列存储索引。【参考方案3】:

您需要单独指定参与的列,不包括 memberOf 和任何其他不能在 columnStore 索引中使用的列

【讨论】:

我尝试了您的建议并收到以下消息:语句失败,因为在创建聚集列存储索引时不允许指定键列表。在不指定键列表的情况下创建聚集列存储索引。 CREATE CLUSTERED COLUMNSTORE INDEX cci ON algtable_20180319_bck (displayname, alias, firstname, lastname, exaddress)

以上是关于列具有无法参与列存储索引的数据类型的主要内容,如果未能解决你的问题,请参考以下文章

具有多个共享列的 MySql 索引策略

BigQuery:加载具有日期列数据类型的 avro 文件,只要转换为时间戳

PLSQL 在变量中存储具有未知数据类型的游标(使用 FETCH INTO)

绪论考点

了解数据库对象

哪种列类型用于将年份字段存储在具有年度数据行的表中