如何在不更改现有数据位置的情况下添加新的 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 分区范围来容纳未来的数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不包含新列名和类型的情况下更改现有 Hive 表中的列注释?