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 ] )
[ ; ]

参数

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>]中列出的顺序。 同一个 file_group_name 可以在 [, ...<n>]中指定多个时间。 如果 n 不足以容纳 partition_function_name中指定的分区数,则 CREATE PARTITION SCHEME 失败并出现错误。

如果 partition_function_name 生成的分区数少于文件组,则第一个未分配的文件组将标记为 NEXT USED,并且显示一条信息消息,用于命名 NEXT USED 文件组。 如果指定了 ALL,则唯一 file_group_name 将维护此 NEXT USED 属性。 如果 NEXT USED 语句中创建一个分区,则 ALTER PARTITION FUNCTION 文件组会收到额外的分区。 若要创建更多未分配的文件组来保存新分区,请使用 ALTER PARTITION SCHEME

<file_group_name> [, ...<n>]中指定主文件组时,PRIMARY 必须按 [PRIMARY]分隔,因为它是关键字。

SQL 数据库仅支持 PRIMARY。 请参阅 示例 E

权限

以下权限可用于执行 CREATE PARTITION SCHEME

  • ALTER ANY DATASPACE 权限。 默认情况下,此权限授予 sysadmin 固定服务器角色和 db_ownerdb_ddladmin 固定数据库角色的成员。

  • 对要在其中创建分区方案的数据库 CONTROLALTER 权限。

  • CONTROL SERVERALTER 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);

将分配使用分区函数 myRangePF1 分区列 col1 的表的分区,如下表所示。

文件组 分区
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);

将分配使用分区函数 myRangePF2 分区列 col1 的表的分区,如下表所示。

文件组 分区
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);

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

Partition scheme 'myRangePS4' has been created successfully. 'test5fg' is marked as the next used filegroup in partition scheme '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]);