适用范围:SQL Server 
Azure SQL 数据库 
Azure SQL 托管实例
通过使用 Transact-SQL 在已分区表或已分区索引的分区函数中增加或减少指定的分区数(按 1 的倍数增减),可以更改 SQL Server、Azure SQL 数据库和 Azure SQL 托管实例中表或索引的分区方式。 增加分区的方法是将某个现有的分区“拆分”为两个分区并重新定义新分区的边界。 减少分区的方法是将两个分区的边界“合并”成一个。 减少分区操作将重新填充一个分区而不对另一个分区进行分配。 在修改分区函数之前,请首先阅读 最佳做法。
注意
多个表或索引可以使用同一分区函数。 在修改分区函数时,将影响单个事务中的所有表或索引。 请首先检查 分区函数的依赖项,然后再进行修改。
Azure Synapse Analytics 的专用 SQL 池中也提供了表分区功能,但语法存在一些差异。 要了解详细信息,请参阅 在专用 SQL 池中对表分区。
限制
- ALTER PARTITION FUNCTION 只能用于将一个分区拆分为两个,或将两个分区合并为一个。 若要更改表或索引的分区方式(例如,从 10 个分区变为 5 个分区),可以使用下列选项之一: - 使用所需的分区函数创建一个新的已分区表,然后使用 INSERT INTO ... SELECT FROM Transact-SQL 语句或者在 SQL Server Management Studio (SSMS) 中使用“管理分区向导”将旧表中的数据插入新表。 
- 为堆创建分区聚集索引。 - 注意 - 删除已分区的聚集索引将产生分区堆。 
- 通过将 Transact-SQL CREATE INDEX 语句与 DROP EXISTING = ON 子句一起使用来删除并重新生成现有的已分区索引。 
- 执行一系列 ALTER PARTITION FUNCTION 语句。 
 
- 数据库引擎不对修改分区函数提供复制支持。 如果要对发布数据库中的分区函数进行更改,必须在订阅数据库中手动执行此操作。 
- ALTER PARTITION FUNCTION 所影响的全部文件组都必须处于联机状态。 
权限
可以使用以下任意权限执行 ALTER PARTITION FUNCTION:
- ALTER ANY DATASPACE 权限。 默认情况下,此权限授予 sysadmin 固定服务器角色和 db_owner 及 db_ddladmin 固定数据库角色的成员。 
- 对创建分区函数时所在数据库的 CONTROL 或 ALTER 权限。 
- 对包含创建分区函数所在的数据库的服务器具有 CONTROL SERVER 或 ALTER ANY DATABASE 权限。 
查询数据库中的已分区对象
以下查询列出了数据库中的所有已分区对象。 这可用于在修改分区函数之前检查其依赖项。
SELECT 
	PF.name AS PartitionFunction,
	ds.name AS PartitionScheme,
    OBJECT_SCHEMA_NAME(si.object_id) as SchemaName,
	OBJECT_NAME(si.object_id) AS PartitionedTable, 
	si.name as IndexName
FROM sys.indexes AS si
JOIN sys.data_spaces AS ds
	ON ds.data_space_id = si.data_space_id
JOIN sys.partition_schemes AS PS
	ON PS.data_space_id = si.data_space_id
JOIN sys.partition_functions AS PF
	ON PF.function_id = PS.function_id
WHERE ds.type = 'PS'
AND OBJECTPROPERTYEX(si.object_id, 'BaseType') = 'U'
ORDER BY PartitionFunction, PartitionScheme, SchemaName, PartitionedTable;
使用 Transact-SQL 拆分分区
- 在对象资源管理器中,连接到目标数据库。 
- 在标准栏上,选择“新建查询” 。 
- 将以下示例复制并粘贴到查询窗口中,然后选择“执行”。 - 本示例: - 检查分区函数 myRangePF1的早期版本,并在找到后将其删除。
- 创建一个名为 myRangePF1的分区函数,将表分区为四个分区。
- 将 boundary_values 在 100 和 1000 之间的分区进行拆分,以创建一个 boundary_values 在 100 和 500 之间的分区,以及一个 boundary_values 在 500 和 1000 之间的分区。
 - 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 ALTER PARTITION FUNCTION myRangePF1 () SPLIT RANGE (500);
- 检查分区函数 
使用 Transact-SQL 合并两个分区
- 在对象资源管理器中,连接到目标数据库。 
- 在标准栏上,选择“新建查询” 。 
- 将以下示例复制并粘贴到查询窗口中,然后选择“执行”。 - 本示例: - 检查分区函数 myRangePF1是否存在早期版本,并在找到后将其删除。
- 创建一个具有三个边界值的名为 myRangePF1的分区函数,这将生成四个分区。
- 将 boundary_values 在 1 和 100 之间的分区与 boundary_values 在 100 和 1,000 之间的分区进行合并。
- 这会导致分区函数 myRangePF1具有 1 和 1,000 这两个边界点。
 - 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 ALTER PARTITION FUNCTION myRangePF1 () MERGE RANGE (100);
- 检查分区函数 
使用 SSMS 删除分区函数
- 在对象资源管理器中,连接到目标数据库。 
- 展开要从中删除分区函数的数据库,然后展开 “存储” 文件夹。 
- 展开 “分区函数” 文件夹。 
- 右键单击要删除的分区函数,然后选择“删除”。 
- 在“删除对象”对话框中,确保选择的分区函数正确,然后选择“确定”。 
后续步骤
通过以下文章详细了解相关概念: