TRUNCATE表中的分区失败(SQL Server)



我有一个表格Log:

CREATE TABLE [dbo].[Log]
(
[Id] [INT] IDENTITY(1,1) NOT NULL,
[Date] [DATETIME] NOT NULL,
[Thread] [VARCHAR](255) NOT NULL,
[Level] [VARCHAR](50) NOT NULL,
[Logger] [VARCHAR](255) NOT NULL,
[Message] [VARCHAR](4000) NOT NULL,
[Exception] [VARCHAR](2000) NULL,
CONSTRAINT [PK_Log] 
PRIMARY KEY NONCLUSTERED ([Id] ASC)
)

PK是Id,在对列[Date]创建索引并将PK更改为非集群:之后,我们对其进行了分区

ALTER TABLE [dbo].[Log] 
ADD CONSTRAINT [PK_Log] 
PRIMARY KEY NONCLUSTERED ([Id] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
CREATE CLUSTERED INDEX [IX_Log_Date] 
ON [dbo].[Log]([Date] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)

分区已成功创建。

现在,我们想使用Truncate来删除分区:

TRUNCATE TABLE [dbo].[Log]
WITH (PARTITIONS (1 TO 2));

但是得到这个错误:

TRUNCATE TABLE语句失败。索引"PK_Log"未分区,但表"Log"使用了分区函数"myDateRangePF"。索引和表必须使用等效的分区函数。

这是否意味着分区表只能有一个索引?如果现有表有多个索引,为了截断它,我们必须首先删除所有索引?

感谢

问题是您创建了索引PK_Log...ON [PRIMARY],这使它成为分区表上的非分区索引。您需要删除该索引(可能还有任何其他未分区的索引(并重新创建它。显式指定分区文件组,或者去掉ON子句,让SQL Server选择文件组。默认情况下,它将在与基础表相同的文件组上创建索引,并使用与表相同的分区。

有关更多信息,请参阅BOL中的分区索引。

最新更新