分区表和分区列存储索引

问题描述 投票:0回答:1

我有一个像这样的分区表:

CREATE TABLE [dbo].[OrderDetailMessage]
(
    [OrderDetailMessageId] [BIGINT] IDENTITY(1,1) NOT NULL,
    [Id] [UNIQUEIDENTIFIER] NULL,
    ...
)
ON [PS_BusinessDate](BusinessDate)
WITH (DATA_COMPRESSION = ROW); 
GO 

我也有这样的非分区主键:

ALTER TABLE [dbo].[OrderDetailMessage] 
    ADD CONSTRAINT [PK_OrderDetailMessage] 
        PRIMARY KEY CLUSTERED ([OrderDetailMessageId] ASC)
            WITH (DATA_COMPRESSION = ROW)
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 [PS_BusinessDate](BusinessDate);

我收到此错误:

消息 35316,第 16 层,状态 1,第 172 行
该语句失败,因为列存储索引必须与基表分区对齐。使用与基表相同的分区函数和相同(或等效)的分区方案创建列存储索引。如果基表未分区,请创建非分区列存储索引。

我只是想了解为什么?我对其他表做了同样的事情,但没有遇到这种错误。

sql-server partitioning database-partitioning columnstore
1个回答
0
投票

错误是因为表没有分区。非分区聚集主键约束的创建将表组织从分区堆更改为具有聚集索引的非分区表。

如果将主键约束创建为非聚集,则表将保留分区堆并允许创建列存储索引:

ALTER TABLE [dbo].[OrderDetailMessage] ADD  CONSTRAINT [PK_OrderDetailMessage] PRIMARY KEY NONCLUSTERED 
(
    [OrderDetailMessageId] ASC
)WITH (DATA_COMPRESSION = ROW)
ON [PRIMARY];
GO

如果您想要聚集主键和分区列存储索引,则必须对聚集索引进行分区。这意味着必须将 BusinessDate 添加到 PK,因为唯一分区索引要求分区列是索引键列,如下例所示。至于这是否适合您的情况,取决于您的查询和分区用例。

ALTER TABLE [dbo].[OrderDetailMessage] ADD  CONSTRAINT [PK_OrderDetailMessage] PRIMARY KEY NONCLUSTERED 
(
     [OrderDetailMessageId] ASC
    ,[BusinessDate]
)WITH (DATA_COMPRESSION = ROW)
ON [PS_BusinessDate](BusinessDate);
© www.soinside.com 2019 - 2024. All rights reserved.