CREATE PARTITION SCHEME (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

在当前数据库中创建一个将已分区表或已分区索引的分区映射到一个或多个文件组的方案。 将表或索引的行映射到分区的值是在分区函数中指定的。 必须首先在 CREATE PARTITION FUNCTION 语句中创建分区功能,然后才能创建分区方案。

注意

Azure SQL 数据库 中仅支持主文件组。 有关文件组和分区策略,请查看文件组

Transact-SQL 语法约定

语法

CREATE PARTITION SCHEME partition_scheme_name  
AS PARTITION partition_function_name  
[ ALL ] TO ( { file_group_name | [ PRIMARY ] } [ ,...n ] )  
[ ; ]  

注意

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

参数

partition_scheme_name
分区方案的名称。 分区方案名称在数据库中必须是唯一的,并且符合标识符规则。

partition_function_name
使用分区方案的分区函数的名称。 分区函数所创建的分区将映射到在分区方案中指定的文件组。 数据库中必须已存在 partition_function_name。 单个分区不能同时包含 FILESTREAM 和非 FILESTREAM 文件组。

ALL
指定所有分区都映射到在 file_group_name 中提供的文件组,或映射到主文件组(如果指定了 [PRIMARY])。 如果指定了 ALL,则只能指定一个 file_group_name

file_group_name[ PRIMARY ] [ ,...n] |
指定用来持有由 partition_function_name 指定的分区的文件组的名称。 数据库中必须已存在 file_group_name

如果指定了 [PRIMARY],则分区将存储于主文件组中。 如果指定了 ALL,则只能指定一个 file_group_name。 分区分配到文件组的顺序是从分区 1 开始,按文件组在 [ ,...n] 中列出的顺序进行分配。 在 [ ,...n] 中,可以多次指定同一个 file_group_name。 如果 n 不足以拥有在 partition_function_name 中指定的分区数,则 CREATEPARTITION SCHEME 将失败,并返回错误。

如果 partition_function_name 生成的分区数少于文件组数,则第一个未分配的文件组将标记为 NEXT USED,并且出现显示命名 NEXT USED 文件组的信息。 如果指定了 ALL,则单独的 file_group_name 将为该 partition_function_name 保持它的 NEXT USED 属性。 如果在 ALTER PARTITION FUNCTION 语句中创建了一个分区,则 NEXT USED 文件组将再接收一个分区。 若要再创建一个未分配的文件组来拥有新的分区,请使用 ALTER PARTITION SCHEME。

在 file_group_name [ ,...n] 中指定主文件组时,必须像在 [PRIMARY] 中那样分隔 PRIMARY,因为它是关键字。

对于 SQL 数据库,只支持 PRIMARY。 请参阅以下示例。

权限

可以使用下列权限执行 CREATE PARTITION SCHEME:

  • ALTER ANY DATASPACE 权限。 默认情况下,此权限授予 sysadmin 固定服务器角色和 db_ownerdb_ddladmin 固定数据库角色的成员。
  • 对要在其中创建分区方案的数据库具有 CONTROL 或 ALTER 权限。
  • 对要在其中创建分区方案的数据库所在服务器具有 CONTROL SERVER 或 ALTER ANY DATABASE 权限。

示例

A. 创建用于将每个分区映射到不同文件组的分区方案

以下示例创建一个分区函数,将表或索引分为四个分区。 然后创建一个分区方案,在其中指定拥有这四个分区中每一个分区的文件组。 此示例假定数据库中已经存在文件组。

CREATE PARTITION FUNCTION myRangePF1 (INT)  
AS RANGE LEFT FOR VALUES (1, 100, 1000);  
GO  
CREATE PARTITION SCHEME myRangePS1  
AS PARTITION myRangePF1  
TO (test1fg, test2fg, test3fg, test4fg);  

对分区依据列 col1 使用分区函数 myRangePF1 的表的分区会按下表所示进行分配

文件组 分区
test1fg 1 col1<= 1
test2fg 2 col1>1 AND col1<= 100
test3fg 3 col1>100 AND col1<= 1000
test4fg 4 col1>1000

B. 创建将多个分区映射到同一个文件组的分区方案

如果所有分区都映射到同一个文件组,则使用 ALL 关键字。 但是,如果是多个(但不是全部)分区映射到同一个文件组,则文件组名称必须进行重复,如以下示例所示。

CREATE PARTITION FUNCTION myRangePF2 (INT)  
AS RANGE LEFT FOR VALUES (1, 100, 1000);  
GO  
CREATE PARTITION SCHEME myRangePS2  
AS PARTITION myRangePF2  
TO ( test1fg, test1fg, test1fg, test2fg );  

对分区依据列 col1 使用分区函数 myRangePF2 的表的分区会按下表所示进行分配

文件组 分区
test1fg 1 col1<= 1
test1fg 2 col1>1 AND col1<= 100
test1fg 3 col1>100 AND col1<= 1000
test2fg 4 col1>1000

C. 创建将所有分区映射到同一个文件组的分区方案

以下示例创建的分区函数与前面的示例相同,并且创建一个将所有分区映射到同一个文件组的分区方案。

CREATE PARTITION FUNCTION myRangePF3 (INT)  
AS RANGE LEFT FOR VALUES (1, 100, 1000);  
GO  
CREATE PARTITION SCHEME myRangePS3  
AS PARTITION myRangePF3  
ALL TO ( test1fg );  

D. 创建指定“NEXT USED”文件组的分区方案

以下示例创建的分区函数与前面的示例相同,并且所创建的分区方案列出的文件组数超过了关联的分区函数所创建的分区数。

CREATE PARTITION FUNCTION myRangePF4 (INT)  
AS RANGE LEFT FOR VALUES (1, 100, 1000);  
GO  
CREATE PARTITION SCHEME myRangePS4  
AS PARTITION myRangePF4  
TO (test1fg, test2fg, test3fg, test4fg, test5fg)  

执行语句将返回以下消息。

已成功创建分区方案 'myRangePS4'。 'test5fg' 在分区方案 'myRangePS4' 中标记为下次使用的文件组。

如果将分区函数 myRangePF4 更改为添加一个分区,则文件组 test5fg 将接收到新创建的分区。

E. 仅在 PRIMARY 上创建分区方案

Azure SQL 数据库 中不支持添加文件和文件组,但支持通过仅跨 PRIMARY 文件组进行分区来进行表分区。

以下示例创建一个分区函数,将表或索引分为四个分区。 然后创建一个分区方案,指定在 PRIMARY 文件组中创建所有分区。

CREATE PARTITION FUNCTION myRangePF1 (INT)  
AS RANGE LEFT FOR VALUES (1, 100, 1000);  
GO  
CREATE PARTITION SCHEME myRangePS1  
AS PARTITION myRangePF1  
ALL TO ( [PRIMARY] );  

后续步骤

通过以下文章详细了解表分区和相关概念: