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

Posted

技术标签:

【中文标题】如何在不更改现有数据位置的情况下添加新的 SQL Server 分区范围来容纳未来的数据?【英文标题】:How do I add a new SQL Server partition range to house future data without altering the existing data locations? 【发布时间】:2021-12-15 19:10:03 【问题描述】:

几年前,我对一组非常大的列存储索引表进行了分区。为简单起见,假设我有四个分区文件,其中根据客户 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 位及以上的客户创建空间。我试着这样做:

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

但我收到以下错误:

ALTER PARTITION 语句的 SPLIT 子句失败,因为分区 不是空的。只有空分区才能被拆分 表上存在列存储索引。考虑一个 ALTER TABLE SWITCH 从源表上的一个非空分区到一个 临时登台表,然后重新尝试 ALTER PARTITION SPLIT 手术。完成后,使用 ALTER TABLE SWITCH 移动暂存 表分区回原来的源表。

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

【问题讨论】:

【参考方案1】:

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

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

使用 RANGE LEFT,您必须始终在末尾保持一个空分区才能拆分。

【讨论】:

重申一下,确保我理解:因为我选择了 RANGE LEFT 并且最后没有维护一个空分区进行拆分,所以我需要先将所有数据移出 75-MaxVal 分区分裂它。对吗? 是的。或者在新的 RANGE RIGHT 分区方案上重建 CCI。例如CREATE CLUSTERED COLUMNSTORE INDEX [CCI_GiantTable] ON [GiantTable] with (drop_existing=on) ON [CustomerPS_new]([CustomerId])

以上是关于如何在不更改现有数据位置的情况下添加新的 SQL Server 分区范围来容纳未来的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不覆盖现有记录的情况下将新行添加到数据表

如何在 SQL 中更改现有表的列长度?

如何在不包含新列名和类型的情况下更改现有 Hive 表中的列注释?

如何在不更改现有组件文件的情况下通过插件将日期类型更改为下拉列表

如何更改现有 Firebase 项目的区域?

在不知道现有密码 PHP 的情况下更改 oracle db 用户密码