$PARTITION (Transact-SQL)

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

为任何指定的分区函数返回分区号,一组分区列值将映射到该分区号中。

Transact-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 第四行

后续步骤

在以下文章中详细了解表分区: