修改分区函数
适用范围: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 删除分区函数
在对象资源管理器中,连接到目标数据库。
展开要从中删除分区函数的数据库,然后展开 “存储” 文件夹。
展开 “分区函数” 文件夹。
右键单击要删除的分区函数,然后选择“删除”。
在“删除对象”对话框中,确保选择的分区函数正确,然后选择“确定”。
后续步骤
通过以下文章详细了解相关概念: