$PARTITION (Transact-SQL)
适用于: SQL Server Azure 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. 获得一组分区列值的分区号
此示例将使用 RANGE LEFT 创建一个将表或索引划分为 4 个分区的分区函数 RangePF1
。 $PARTITION 用于确定将表示 10
的分区列的值 RangePF1
置于表的第 1 分区。
CREATE PARTITION FUNCTION RangePF1 ( INT )
AS RANGE LEFT FOR VALUES (10, 100, 1000) ;
GO
SELECT $PARTITION.RangePF1 (10) ;
GO
B. 获取分区表或索引的每个非空分区的行数
此示例演示如何使用 $PARTITION
返回包含数据的表的每个分区中的行数。
示例:
- 为分区函数
RangePF1
创建分区方案RangePS1
。 - 在分区方案
RangePS1
中创建一个表dbo.PartitionTable
,并将col1
作为分区列。 - 在
dbo.PartitionTable
表中插入四行。 根据分区函数定义,这些行将插入到分区 2 和 3 中。 分区 1 和 4 将保留空白。 - 查询
dbo.PartitionTable
并在 GROUP BY 子句使用$PARTITION.RangePF1(col1)
查询包含数据的每个分区中的行数。
注意
若要执行此示例,必须先使用上一示例中的代码创建分区函数 RangePF1
。
CREATE PARTITION SCHEME RangePS1
AS PARTITION RangePF1
ALL TO ('PRIMARY') ;
GO
CREATE TABLE dbo.PartitionTable (col1 int PRIMARY KEY, col2 char(10))
ON RangePS1 (col1) ;
GO
INSERT dbo.PartitionTable (col1, col2)
VALUES ((1,'a row'),(100,'another row'),(500,'another row'),(1000,'another row'))
SELECT
$PARTITION.RangePF1(col1) AS Partition,
COUNT(*) AS [COUNT]
FROM dbo.PartitionTable
GROUP BY $PARTITION.RangePF1(col1)
ORDER BY Partition ;
GO
SELECT
查询应会返回以下结果:
分区 | COUNT |
---|---|
2 | 1 |
3 | 3 |
对于存在但不包含数据的分区 1 和 4,不会返回行。
C. 返回分区表或索引的一个分区的所有行
以下示例将返回表 PartitionTable
的分区 3 中的所有行。
SELECT col1, col2
FROM dbo.PartitionTable
WHERE $PARTITION.RangePF1(col1) = 3 ;
该查询应返回以下结果:
col1 | col2 |
---|---|
101 | 另一行 |
500 | 第三行 |
501 | 第四行 |
后续步骤
在以下文章中详细了解表分区: