如何在不改变现有数据位置的情况下添加新的 SQL 服务器分区范围以容纳未来的数据?

How do I add a new SQL Server partition range to house future data without altering the existing data locations?

几年前,我对一组非常大的列存储索引表进行了分区。为简单起见,假设我有四个分区文件,其中根据客户 ID 的范围存储数据。

CREATE PARTITION FUNCTION [CustomerPF](int) AS RANGE LEFT FOR VALUES (
    N'25'
    ,N'50'
    ,N'75')

CREATE PARTITION SCHEME [CustomerPS] AS PARTITION [CustomerPF] TO (
    customer0to25fg
    ,customer26to50fg
    ,customer51to75fg
    ,customer76plusfg

CREATE CLUSTERED COLUMNSTORE INDEX [CCI_GiantTable] ON [schema].[GiantTable] ON [CustomerPS]([CustomerId])

现在假设我想为 100 岁及以上的客户提前创建 space。我试着这样做:

ALTER PARTITION SCHEME CustomerPS NEXT USED customer100plusfg
ALTER PARTITION FUNCTION [CustomerPF]() SPLIT RANGE (100)

但我收到以下错误:

SPLIT clause of ALTER PARTITION statement failed because the partition is not empty. Only empty partitions can be split in when a columnstore index exists on the table. Consider an ALTER TABLE SWITCH operation from one of the nonempty partitions on the source table to a temporary staging table and then re-attempt the ALTER PARTITION SPLIT operation. Once completed, use ALTER TABLE SWITCH to move the staging table partition back to the original source table.

我希望,因为我还没有 100 或更大的 customerID,所以我可以添加一个新分区,而不必自己更改列存储表。如何为客户 100-n 添加新分区?是否可以在不移动“customer75plus”的所有数据的情况下执行此操作?这些分区中有很多大型列存储表,移动数据并不是那么可行。

您使用 SPLIT 创建的新分区包含拆分点。因此,您正在尝试创建一个新分区 (75-100)。但是分区 (75-MaxVal] 包含数据。

改为使用 RANGE RIGHT 分区方案,这样当您拆分时,新分区位于末尾,因此您可以在当前最大值以上的任何位置拆分。

使用 RANGE LEFT 时,您必须始终在要拆分的末尾保留一个空分区。