CREATE PARTITION FUNCTION (Transact

您所在的位置:网站首页 简述range函数的使用规则是 CREATE PARTITION FUNCTION (Transact

CREATE PARTITION FUNCTION (Transact

2023-11-14 00:18| 来源: 网络整理| 查看: 265

CREATE PARTITION FUNCTION (Transact-SQL) 项目 05/30/2023

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

在当前数据库中创建一个函数,该函数可根据指定列的值将表或索引的各行映射到分区。 使用 CREATE PARTITION FUNCTION 是创建已分区表或索引的第一步。 一张表或一个索引最多可以有 15,000 个分区。

Transact-SQL 语法约定

语法 CREATE PARTITION FUNCTION partition_function_name ( input_parameter_type ) AS RANGE [ LEFT | RIGHT ] FOR VALUES ( [ boundary_value [ ,...n ] ] ) [ ; ]

注意

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

参数

partition_function_name 是分区函数的名称。 分区函数名称在数据库内必须唯一,并且符合标识符规则。

input_parameter_type 是用于分区的列的数据类型。 所有数据类型都可有效用作分区列,除了 text、 ntext、 image、 xml、 timestamp、 varchar(max)、 nvarchar(max)、 varbinary(max)、别名数据类型或 CLR 用户定义的数据类型。

实际列(也称为分区列)是在 CREATE TABLE 或 CREATE INDEX 语句中指定的。

boundary_value 为使用 partition_function_name 的已分区表或索引的每个分区指定边界值。 如果 boundary_value 为空,则分区函数使用 partition_function_name 将整个表或索引映射到单个分区。 只能使用 CREATE TABLE 或 CREATE INDEX 语句中指定的一个分区列。

boundary_value 是可以引用变量的常量表达式。 这包括用户定义类型变量,或函数以及用户定义函数。 它不能引用 Transact-SQL 表达式。 boundary_value 必须匹配或可以隐式转换为 input_parameter_type 中提供的数据类型,并且当值的大小和小数位数不匹配其对应 input_parameter_type 时,将无法在隐式转换过程中被截断。

注意

如果 boundary_value 包含 datetime 或 smalldatetime 文字值,则为这些文字值在计算时假设会话语言为 us_english。 不推荐使用此行为。 要确保分区函数定义对于所有会话语言都具有预期的行为,建议使用对于所有语言设置都以相同方式进行解释的常量,例如 yyyymmdd 格式;或者将文字值显式转换为特定样式。 若要确定服务器的语言会话,请运行 SELECT @@LANGUAGE。

有关详细信息,请参阅文字日期字符串转换为日期值的不确定性转换。

...n 指定 boundary_value 提供的值的数目,不能超过 14,999。 创建的分区数等于 n + 1。 不必按顺序列出各值。 如果值未按顺序列出,则数据库引擎将对它们进行排序、创建函数并返回一个警告,说明未按顺序提供值。 如果 n 包括任何重复的值,则数据库引擎将返回错误。

LEFT | RIGHT 指定当间隔值由 数据库引擎 按升序从左到右排序时,boundary_value [ ,...n ] 属于每个边界值间隔的哪一侧(左侧还是右侧)。 如果未指定,则默认值为 LEFT。

备注

分区函数的作用域被限制为在其中创建该分区函数的数据库。 在该数据库内,分区函数驻留在与其他函数的命名空间不同的一个单独命名空间内。

分区列为空值的所有行都放在最左侧分区中,除非将 NULL 指定为边界值并指定了 RIGHT。 在这种情况下,最左侧分区为空分区,NULL 值被放置在后面的分区中。

权限

可以使用下列任何一种权限执行 CREATE PARTITION FUNCTION:

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

在其中创建分区函数的数据库的 CONTROL 或 ALTER 权限。

在其中创建分区函数的数据库所在服务器的 CONTROL SERVER 或 ALTER ANY DATABASE 权限。

示例 A. 对 int 列创建 RANGE LEFT 分区函数

以下分区函数将表或索引分为四个分区。

CREATE PARTITION FUNCTION myRangePF1 (int) AS RANGE LEFT FOR VALUES (1, 100, 1000);

下表显示对分区依据列 col1 使用此分区函数的表如何进行分区。

分区 1 2 3 4 值 col11 AND col1100 AND col11000 B. 对 int 列创建 RANGE RIGHT 分区函数

以下分区函数与上一个示例使用相同的 boundary_value [ ,...n ] 值,但它指定 RANGE RIGHT。

CREATE PARTITION FUNCTION myRangePF2 (int) AS RANGE RIGHT FOR VALUES (1, 100, 1000);

下表显示对分区依据列 col1 使用此分区函数的表如何进行分区。

分区 1 2 3 4 值 col1= 1 AND col1= 100 AND col1= 1000 C. 对 datetime 列创建 RANGE RIGHT 分区函数

以下分区函数将表或索引分成 12 个分区,每个分区对应 datetime 列中的一年中一个月的值。

CREATE PARTITION FUNCTION [myDateRangePF1] (datetime) AS RANGE RIGHT FOR VALUES ('20030201', '20030301', '20030401', '20030501', '20030601', '20030701', '20030801', '20030901', '20031001', '20031101', '20031201');

下表显示对分区依据列 datecol 上使用此分区函数的表或索引如何进行分区。

分区 1 2 ... 11 12 值 datecol = February 1, 2003 AND datecol= November 1, 2003 AND col1= December 1, 2003 D. 对 char 列创建分区函数

以下分区函数将表或索引分为四个分区。

CREATE PARTITION FUNCTION myRangePF3 (char(20)) AS RANGE RIGHT FOR VALUES ('EX', 'RXE', 'XR');

下表显示对分区依据列 col1 使用此分区函数的表如何进行分区。

分区 1 2 3 4 值 col1 = EX AND col1= RXE AND col1= XR E. 创建 15,000 个分区

以下分区函数将表或索引分为 15,000 个分区。

--Create integer partition function for 15,000 partitions. DECLARE @IntegerPartitionFunction nvarchar(max) = N'CREATE PARTITION FUNCTION IntegerPartitionFunction (int) AS RANGE RIGHT FOR VALUES ('; DECLARE @i int = 1; WHILE @i < 14999 BEGIN SET @IntegerPartitionFunction += CAST(@i as nvarchar(10)) + N', '; SET @i += 1; END SET @IntegerPartitionFunction += CAST(@i as nvarchar(10)) + N');'; EXEC sp_executesql @IntegerPartitionFunction; GO F. 为多个年度创建分区

以下分区函数将表或索引在 datetime2 列上分为 50 个分区。 对于 2007 年 1 月至 2011 年 1 月之间的每个月,都有一个分区。

--Create date partition function with increment by month. DECLARE @DatePartitionFunction nvarchar(max) = N'CREATE PARTITION FUNCTION DatePartitionFunction (datetime2) AS RANGE RIGHT FOR VALUES ('; DECLARE @i datetime2 = '20070101'; WHILE @i < '20110101' BEGIN SET @DatePartitionFunction += '''' + CAST(@i as nvarchar(10)) + '''' + N', '; SET @i = DATEADD(MM, 1, @i); END SET @DatePartitionFunction += '''' + CAST(@i as nvarchar(10))+ '''' + N');'; EXEC sp_executesql @DatePartitionFunction; GO 后续步骤

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

CREATE PARTITION SCHEME (Transact-SQL) 已分区表和已分区索引 修改分区函数 修改分区方案 sys.partition_functions (Transact-SQL) sys.partition_schemes (Transact-SQL)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3