$PARTITION (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

指定したパーティション関数に対して、パーティション分割列の値のセットがマップされるパーティション番号を返します。

Transact-SQL 構文表記規則

構文

[ database_name. ] $PARTITION.partition_function_name(expression)  

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

database_name
パーティション関数を含むデータベースの名前を指定します。

partition_function_name
パーティション分割列の値のセットが適用される、既存のパーティション関数の名前を指定します。

式 (expression)
を指定します。このデータ型は、対応するパーティション分割列のデータ型と一致するか、パーティション分割列のデータ型に暗黙的に変換される必要があります。 に現在参加しているパーティション分割列の名前を指定できますも partition_function_nameです。

戻り値の型

int

解説

$PARTITION 返します、 int 1 ~ パーティション関数のパーティションの数の値です。

$PARTITION は、値が現在パーティション関数を使用するパーティション テーブルまたはインデックスに存在するかどうかに関係なく、有効な値のパーティション番号を返します。

A. パーティション分割列の値のセットに対してパーティション番号を取得する

この例では、RANGE LEFT を使用してパーティション関数 RangePF1 を作成します。これにより、テーブルまたはインデックスが 4 つのパーティションに分割されます。 $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 に対して、パーティション分割列として col1 を使用するテーブル dbo.PartitionTable を作成します。
  • dbo.PartitionTable テーブルに 4 つの行を挿入します。 パーティション関数の定義に基づいて、これらの行はパーティション 2 と 3 に挿入されます。 パーティション 1 と 4 は空のままになります。
  • dbo.PartitionTable のクエリを実行し、GROUP BY 句で $PARTITION.RangePF1(col1) を使用し、データを含む各パーティションの行数に対してクエリを実行します。

Note

この例を実行するには、まず前の例のコードを使用してパーティション関数 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 クエリにより、次の結果が得られます。

Partition [COUNT]
2 1
3 3

存在するがデータを含まないパーティション番号 1 と 4 の行は返されません。

C. パーティション テーブルまたはパーティション インデックスの 1 つのパーティションからすべての行を返す

次の例では、テーブル PartitionTable のパーティション 3 内にあるすべての行を返します。

SELECT col1, col2
FROM dbo.PartitionTable
WHERE $PARTITION.RangePF1(col1) = 3 ;  

このクエリにより、次の結果が得られます。

col1 col2
101 別の行
500 3 行目
501 4 行目

次のステップ

テーブルのパーティション分割の詳細については、次の記事を参照してください。