ALTER PARTITION FUNCTION (Transact-SQL)
通过拆分或合并边界值更改分区函数。 通过执行 ALTER PARTITION FUNCTION,可以将使用分区函数的任何表或索引的某个分区拆分为两个分区,也可以将两个分区合并为一个分区。
备注
多个表或索引可以使用同一分区函数。ALTER PARTITION FUNCTION 在单个事务中影响所有这些表或索引。
适用范围:SQL Server(SQL Server 2008 到当前版本)。 |
语法
ALTER PARTITION FUNCTION partition_function_name()
{
SPLIT RANGE ( boundary_value )
| MERGE RANGE ( boundary_value )
} [ ; ]
参数
partition_function_name
要修改的分区函数的名称。SPLIT RANGE ( boundary_value )
在分区函数中添加一个分区。 boundary_value 确定新分区的范围,因此它必须不同于分区函数的现有边界范围。 根据 boundary_value,数据库引擎将某个现有范围拆分为两个范围。 在这两个范围中,新 boundary_value 所在的范围被视为是新分区。文件组必须处于联机状态,并且必须由使用此分区函数的分区方案标记为 NEXT USED,以保存新分区。 在 CREATE PARTITION SCHEME 语句中,将把文件组分配给分区。 如果 CREATE PARTITION SCHEME 语句分配了多余的文件组(在 CREATE PARTITION FUNCTION 语句中创建的分区数少于用于保存它们的文件组),则存在未分配的文件组,分区方案将把其中的某个文件组标记为 NEXT USED。 该文件组将保存新的分区。 如果分区方案未将任何文件组标记为 NEXT USED,则必须使用 ALTER PARTITION SCHEME 添加一个文件组或指定一个现有文件组来保存新分区。 可以指定已保存分区的文件组来保存附加分区。 由于一个分区函数可以参与多个分区方案,因此所有使用分区函数(您向其中添加了分区)的分区方案都必须拥有一个 NEXT USED 文件组。 否则,ALTER PARTITION FUNCTION 将失败并出现错误,该错误显示缺少 NEXT USED 文件组的一个或多个分区方案。
如果在同一文件组创建所有分区,则最初自动将该文件组分配为 NEXT USED 文件组。 但是,在执行拆分操作后,将不再有指定的 NEXT USED 文件组。 您必须通过使用 ALTER PARITION SCHEME 显式将该文件组分配为 NEXT USED 文件组,否则后续的拆分操作将失败。
MERGE [ RANGE ( boundary_value) ]
删除一个分区并将该分区中存在的所有值都合并到剩余的某个分区中。 RANGE (boundary_value) 必须是一个现有边界值,已删除分区中的值将合并到该值中。 如果最初保存 boundary_value 的文件组没有被剩余分区使用,也没有使用 NEXT USED 属性进行标记,则将从分区方案中删除该文件组。 合并的分区驻留在最初不保存 boundary_value 的文件组中。 boundary_value 是一个可以引用变量(包括用户定义类型变量)或函数(包括用户定义函数)的常量表达式。 它无法引用 Transact-SQL 表达式。 boundary_value 必须匹配或可以隐式转换为其对应分区列的数据类型,并且当值的大小和小数位数不匹配其对应的 input_parameter_type 时,将无法在隐式转换过程中被截断。
最佳做法
始终在分区范围的两端保留空分区,以便确保分区拆分(在加载新数据前)和分区合并(在加载旧数据后)不会产生任何数据移动。 避免拆分或合并填充的分区。 这样做可能效率非常低下,因为这可能导致生成多达四次日志,并且还可能导致严重的锁定问题。
限制和局限
ALTER PARTITION FUNCTION 在单个原子操作中对使用该函数的任何表和索引进行重新分区。 但该操作在脱机状态下进行,并且根据重新分区的范围,可能会消耗大量资源。
ALTER PARTITION FUNCTION 只能用于将一个分区拆分为两个分区,或将两个分区合并为一个分区。 若要更改其他情况下对表进行分区方法(例如,将 10 个分区合并为 5 个分区),可以尝试使用以下任何选项。 根据系统配置,这些选项可能在资源消耗方面有所不同:
使用所需的分区函数创建一个新的已分区表,然后使用 INSERT INTO...SELECT FROM 语句将旧表中的数据插入新表。
为堆创建分区聚集索引。
备注
删除已分区的聚集索引将产生分区堆。
通过将 Transact-SQL CREATE INDEX 语句与 DROP EXISTING = ON 子句一起使用来删除并重新生成现有的已分区索引。
执行一系列 ALTER PARTITION FUNCTION 语句。
ALTER PARITITION FUNCTION 所影响的全部文件组都必须处于联机状态。
如果使用分区函数的任何表中存在已禁用的聚集索引,ALTER PARTITION FUNCTION 都将失败。
SQL Server 不对修改分区函数提供复制支持。 必须在订阅数据库中手动应用对发布数据库中的分区函数的更改。
权限
可以使用以下任意权限执行 ALTER PARTITION FUNCTION:
ALTER ANY DATASPACE 权限。 默认情况下,此权限授予 sysadmin 固定服务器角色和 db_owner 及 db_ddladmin 固定数据库角色的成员。
对创建分区函数时所在数据库的 CONTROL 或 ALTER 权限。
对包含创建分区函数所在的数据库的服务器具有 CONTROL SERVER 或 ALTER ANY DATABASE 权限。
示例
A.将已分区表或索引的一个分区拆分为两个分区
以下示例创建一个分区函数,将表或索引分为四个分区。 ALTER PARTITION FUNCTION 将某个分区拆分为两个分区,从而总共创建五个分区。
IF EXISTS (SELECT * FROM sys.partition_functions
WHERE name = 'myRangePF1')
DROP PARTITION FUNCTION myRangePF1;
GO
CREATE PARTITION FUNCTION myRangePF1 (int)
AS RANGE LEFT FOR VALUES ( 1, 100, 1000 );
GO
--Split the partition between boundary_values 100 and 1000
--to create two partitions between boundary_values 100 and 500
--and between boundary_values 500 and 1000.
ALTER PARTITION FUNCTION myRangePF1 ()
SPLIT RANGE (500);
B.将已分区表的两个分区合并为一个分区
以下示例与上例创建同一分区函数,然后将两个分区合并为一个分区,从而总共创建了三个分区。
IF EXISTS (SELECT * FROM sys.partition_functions
WHERE name = 'myRangePF1')
DROP PARTITION FUNCTION myRangePF1;
GO
CREATE PARTITION FUNCTION myRangePF1 (int)
AS RANGE LEFT FOR VALUES ( 1, 100, 1000 );
GO
--Merge the partitions between boundary_values 1 and 100
--and between boundary_values 100 and 1000 to create one partition
--between boundary_values 1 and 1000.
ALTER PARTITION FUNCTION myRangePF1 ()
MERGE RANGE (100);
请参阅
参考
CREATE PARTITION FUNCTION (Transact-SQL)
DROP PARTITION FUNCTION (Transact-SQL)
CREATE PARTITION SCHEME (Transact-SQL)
ALTER PARTITION SCHEME (Transact-SQL)
DROP PARTITION SCHEME (Transact-SQL)
sys.partition_functions (Transact-SQL)
sys.partition_parameters (Transact-SQL)
sys.partition_range_values (Transact-SQL)
sys.index_columns (Transact-SQL)