CREATE PARTITION SCHEME (Transact-SQL)
适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例
在当前数据库中创建一个将已分区表或已分区索引的分区映射到一个或多个文件组的方案。 将表或索引的行映射到分区的值是在分区函数中指定的。 必须首先在 CREATE PARTITION FUNCTION 语句中创建分区功能,然后才能创建分区方案。
注意
在 Azure 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_owner 及 db_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);
将分配使用分区函数 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]);