You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建聚集列存储索引遇Msg35343错误,如何解决及错误含义?

这个问题我碰到过好几次,咱们先把错误的意思掰明白,再给你几个可行的解决思路:

错误Msg 35343的含义

SQL Server的聚集列存储索引(CCI)对数据类型有严格限制,nvarchar(max) 这类大对象(LOB)类型不在支持列表里。

原因很直接:列存储索引是为分析型查询做的列式压缩优化,它把数据按列打包压缩存储,而LOB数据的存储逻辑是存放在单独的数据页里,长度可变且可能极大,和列存储的压缩、列式存储机制完全不兼容。所以数据库会直接拒绝把这类列包含进聚集列存储索引,也就是报错提示里说的“Omit column 'memberOf'”——得把这个列排除在外。

解决办法

根据你的业务需求,有几个不同的方向可选:

  • 修改列的数据类型(优先考虑,如果业务允许)
    如果你的memberOf列实际存储的内容长度从来没超过4000字符,那直接把类型改成nvarchar(4000)就能解决问题。执行步骤:

    -- 先检查列的最大长度,确认不会截断数据
    SELECT MAX(LEN(memberOf)) FROM agl_20180319_bck;
    -- 修改列类型
    ALTER TABLE agl_20180319_bck ALTER COLUMN memberOf nvarchar(4000) NULL;
    -- 再创建聚集列存储索引
    CREATE CLUSTERED COLUMNSTORE INDEX cci ON agl_20180319_bck;
    
  • 拆分表(保留LOB类型的同时用列存储优化)
    如果必须保留nvarchar(max)类型,可以把表拆成两个:

    1. 主表:包含除memberOf外的所有列,创建聚集列存储索引,专门用于分析查询;
    2. 关联表:只存主键和memberOf列,用行存储。
      这样既享受了列存储的查询性能,又保留了LOB列的功能,需要的时候通过主键关联查询即可。
  • 改用非聚集列存储索引
    如果不想修改表结构,也可以放弃聚集列存储,改用非聚集列存储索引,只包含支持的数据列。比如:

    -- 列出除memberOf外的所有需要优化查询的列
    CREATE NONCLUSTERED COLUMNSTORE INDEX ncci ON agl_20180319_bck (column1, column2, column3, ...);
    

    这样非聚集列存储索引可以加速分析类查询,而原表还是行存储,memberOf列不受影响。

内容的提问来源于stack exchange,提问作者alexithymia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:19:29