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

分区表创建分区列存储索引遇35316错误原因咨询

问题:创建分区非聚集列存储索引时触发Msg 35316错误

操作场景

  1. 创建分区表:
CREATE TABLE [dbo].[OrderDetailMessage]
(
    [OrderDetailMessageId] [BIGINT] IDENTITY(1,1) NOT NULL,
    [Id] [UNIQUEIDENTIFIER] NULL,
    ...
)
ON [PS_BusinessDate](BusinessDate)
WITH (DATA_COMPRESSION = ROW); 
GO 
  1. 创建非分区聚集主键:
ALTER TABLE [dbo].[OrderDetailMessage] 
    ADD CONSTRAINT [PK_OrderDetailMessage] 
        PRIMARY KEY CLUSTERED ([OrderDetailMessageId] ASC)
            WITH (DATA_COMPRESSION = ROW)
ON [PRIMARY];
  1. 尝试创建分区非聚集列存储索引:
CREATE NONCLUSTERED COLUMNSTORE INDEX [csindx_OrderDetailMessage] 
ON [dbo].[OrderDetailMessage] ([OrderDetailMessageId], [Id], ...)
WITH (DROP_EXISTING = OFF, COMPRESSION_DELAY = 0, DATA_COMPRESSION = COLUMNSTORE_ARCHIVE)
ON [PS_BusinessDate](BusinessDate);

报错信息

Msg 35316, Level 16, State 1, Line 172

The statement failed because a columnstore index must be partition-aligned with the base table. Create the columnstore index using the same partition function and same (or equivalent) partition scheme as the base table. If the base table is not partitioned, create a nonpartitioned columnstore index.

错误原因

SQL Server要求列存储索引必须与基表分区对齐,但你的场景存在核心矛盾:

  • 虽然表定义时指定了分区方案PS_BusinessDate,但后续创建的聚集主键指定了ON [PRIMARY]——聚集索引决定了表的物理存储位置,这会覆盖表定义的分区设置,导致基表实际物理存储在非分区的PRIMARY文件组上。
  • 你此时试图用分区方案PS_BusinessDate创建列存储索引,违反了“列存储索引必须与基表存储方式匹配”的规则,因此触发报错。

为何其他表无此问题

你之前操作的其他表,其聚集索引应该是与基表分区对齐的(即创建聚集索引时指定了和表一致的分区方案),此时基表的物理存储确实是分区状态,创建同分区方案的列存储索引自然符合要求,不会报错。

解决方向

两种可选方案:

  • 方案1:修改聚集主键为分区对齐,重新创建主键时指定分区方案:
ALTER TABLE [dbo].[OrderDetailMessage] 
DROP CONSTRAINT [PK_OrderDetailMessage];
GO
ALTER TABLE [dbo].[OrderDetailMessage] 
ADD CONSTRAINT [PK_OrderDetailMessage] 
    PRIMARY KEY CLUSTERED ([OrderDetailMessageId] ASC)
        WITH (DATA_COMPRESSION = ROW)
ON [PS_BusinessDate](BusinessDate); -- 与基表分区方案一致
GO

之后再执行原列存储索引创建语句即可。

  • 方案2:将列存储索引改为非分区,指定ON [PRIMARY]:
CREATE NONCLUSTERED COLUMNSTORE INDEX [csindx_OrderDetailMessage] 
ON [dbo].[OrderDetailMessage] ([OrderDetailMessageId], [Id], ...)
WITH (DROP_EXISTING = OFF, COMPRESSION_DELAY = 0, DATA_COMPRESSION = COLUMNSTORE_ARCHIVE)
ON [PRIMARY]; -- 与基表实际存储一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:55:15