分裂分区和删除分区方案



我为一个有300万行的表创建了一个分区函数和方案。

CREATE PARTITION FUNCTION PartFunc (int) AS RANGE RIGHT FOR VALUES (1, 100,300);
CREATE PARTITION SCHEME PartFuncScheme AS PARTITION PartFunc ALL TO PRIMARY;

之后,为了寻求更好的表现,我用:

ALTER PARTITION FUNCTION PartFunc () SPLIT RANGE (200);

上面的查询被接受了,但是当我试图进一步分割时:

ALTER PARTITION FUNCTION PartFunc () SPLIT RANGE (250);

我得到了错误信息:

分区方案"未使用任何nextfilegroup。未更改分区方案。

被这个消息弄糊涂了,然后我试图通过直接擦除表的聚集索引(col1)来重新构建它:

CREATE CLUSTERED INDEX [col1]
ON [dbo].[PartitionTable1]([col1])
WITH (DROP_EXISTING = ON)
ON [PRIMARY];

则在SMSS中,表的Properties/Storage窗格显示它未被分区。然而,当我试图删除分区方案时,它被拒绝了,并显示一条消息,说该方案不存在或正在表上使用。在SMSS中,分区方案和分区函数仍然显示为图标,它们的属性表明它们将表作为依赖项。

怎么了?

令人恼火的是,您必须更改分区方案,以指定PRIMARY是第一次分割之后下一个使用的文件组。如

use tempdb
CREATE PARTITION FUNCTION PartFunc (int) AS RANGE RIGHT FOR VALUES (1, 100,300);
CREATE PARTITION SCHEME PartFuncScheme AS PARTITION PartFunc ALL TO ([PRIMARY]);
create table t(id int primary key identity, a int) on partfuncscheme(id)
insert into t(a) select 32 from sys.objects
ALTER PARTITION FUNCTION PartFunc () SPLIT RANGE (200);

ALTER PARTITION FUNCTION PartFunc () SPLIT RANGE (250);
--Msg 7710, Level 16, State 1, Line 12
--Warning: The partition scheme 'PartFuncScheme' does not have any next used filegroup. Partition scheme has not been changed.
go
alter partition scheme PartFuncScheme next used [PRIMARY]
ALTER PARTITION FUNCTION PartFunc () SPLIT RANGE (250);

消息,表示方案不存在或正在表上使用。

在分区方案(或其他表)上可能存在来自您的表的非聚集索引。您可以使用如下查询进行检查:

select object_name(i.object_id) table_name, i.name index_name, ds.name partition_scheme
from sys.indexes i
join sys.data_spaces ds
on i.data_space_id = ds.data_space_id
where ds.type = 'PS'

最新更新