$PARTITION (Transact-SQL)
适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例
返回一组分区列值可以映射到任何指定分区函数的分区号。
语法
[ database_name. ] $PARTITION.partition_function_name(expression)
参数
database_name
包含分区函数的数据库的名称。
partition_function_name
要对其应用一组分区列值的任何现有分区函数的名称。
expression
表达式 其数据类型必须匹配或隐式转换为其相应分区列的数据类型。 此参数也可以是当前参与 partition_function_name的分区列的名称。
返回类型
int
备注
$PARTITION
返回 1
和分区函数分区数之间的 int 值。
$PARTITION
返回任何有效值的分区号,无论分区表或索引中当前是否存在使用该分区函数的值。
示例
A. 获得一组分区列值的分区号
此示例将使用 RangePF1
创建一个将表或索引划分为 4 个分区的分区函数 。
$PARTITION
用于确定表示 RangePF1
分区列的值 10
将放入表的分区 1
。
CREATE PARTITION FUNCTION RangePF1(INT)
AS RANGE LEFT
FOR VALUES (10, 100, 1000);
GO
SELECT $PARTITION.RangePF1 (10);
GO
B. 获取分区表或索引的每个非空分区的行数
此示例演示如何使用 $PARTITION
返回包含数据的表的每个分区中的行数。
注意
若要执行此示例,必须先使用上一示例中的代码创建分区函数 RangePF1
。
为分区函数
RangePF1
创建分区方案RangePS1
。CREATE PARTITION SCHEME RangePS1 AS PARTITION RangePF1 ALL TO ('PRIMARY'); GO
在
RangePS1
分区方案中创建表dbo.PartitionTable
,col1
作为分区列。CREATE TABLE dbo.PartitionTable ( col1 INT PRIMARY KEY, col2 CHAR (20) ) ON RangePS1 (col1); GO
将四行插入
dbo.PartitionTable
表中。 这些行根据分区函数RangePF1
定义插入分区:1
和10
转到分区1
,而500
和1000
转到3
。INSERT dbo.PartitionTable (col1, col2) VALUES (1, 'a row'), (10, 'another row'), (500, 'another row'), (1000, 'another row'); GO
查询
dbo.PartitionTable
并使用GROUP BY
子句中的$PARTITION.RangePF1(col1)
查询包含数据的每个分区中的行数。SELECT $PARTITION.RangePF1 (col1) AS Partition, COUNT(*) AS [COUNT] FROM dbo.PartitionTable GROUP BY $PARTITION.RangePF1 (col1) ORDER BY Partition; GO
下面是结果集。
分区 | COUNT |
---|---|
1 | 2 |
3 | 2 |
对于存在但不包含数据的分区号 2
,不会返回行。
C. 返回分区表或索引的一个分区的所有行
以下示例将返回表 PartitionTable
的分区 3 中的所有行。
SELECT col1, col2
FROM dbo.PartitionTable
WHERE $PARTITION.RangePF1 (col1) = 3;
下面是结果集。
col1 | col2 |
---|---|
500 |
另一行 |
1000 |
另一行 |