修改分区函数

适用于:SQL ServerAzure 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_ownerdb_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 拆分分区

  1. 在对象资源管理器中,连接到目标数据库

  2. 在标准栏上,选择“新建查询” 。

  3. 将以下示例复制并粘贴到查询窗口中,然后选择“执行”。

    本示例:

    • 检查分区函数 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 合并两个分区

  1. 在对象资源管理器中,连接到目标数据库

  2. 在标准栏上,选择“新建查询” 。

  3. 将以下示例复制并粘贴到查询窗口中,然后选择“执行”。

    本示例:

    • 检查分区函数 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 删除分区函数

  1. 在对象资源管理器中,连接到目标数据库

  2. 展开要从中删除分区函数的数据库,然后展开 “存储” 文件夹。

  3. 展开 “分区函数” 文件夹。

  4. 右键单击要删除的分区函数,然后选择“删除”。

  5. 在“删除对象”对话框中,确保选择的分区函数正确,然后选择“确定”

后续步骤

通过以下文章详细了解相关概念: