SQL Serverでは、ALTER PARTITION FUNCTION
を使用できます。 2つのパーティションを1つのパーティションにマージします。
これを行うには、MERGE RANGE
を使用します ドロップするパーティションの境界値を提供しながら、引数。
この操作により、パーティションが削除され、パーティションに存在するすべての値が残りのパーティションにマージされます。
例
4つになりたいパーティションが5つあると想像してください。
現在のパーティション
MoviesPartitionFunction
というパーティション関数があります 4つの境界値があります。
SELECT
prv.boundary_id,
prv.[value]
FROM sys.partition_range_values prv
INNER JOIN sys.partition_functions pf
ON prv.function_id = pf.function_id
WHERE pf.name = 'MoviesPartitionFunction';
結果:
+---------------+---------+ | boundary_id | value | |---------------+---------| | 1 | -1 | | 2 | 100 | | 3 | 500 | | 4 | 10000 | +---------------+---------+
これは、5つのパーティションがあることを意味します。
この例では、境界範囲500を削除します。
また、これらのパーティションのいくつかにデータが分散されたテーブルがすでにあると想像してください。
現在、行がパーティション全体にどのように分散されているかを示します。
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
結果:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 400 | | 4 | 3579 | | 5 | 0 | +--------------------+-------------+
Microsoftは、データを含むパーティションをマージ(または分割)しないように実際にアドバイスしていることを指摘しておく必要があります。ただし、この例では、風に注意を払い、データを含む2つのパーティションをマージします。
パーティションをマージする
OK、パーティションをマージしましょう。
ALTER PARTITION FUNCTION MoviesPartitionFunction()
MERGE RANGE (500);
結果:
Commands completed successfully.
パーティションを正常にマージしました。
結果を確認する
結果を確認しましょう。
SELECT
prv.boundary_id,
prv.[value]
FROM sys.partition_range_values prv
INNER JOIN sys.partition_functions pf
ON prv.function_id = pf.function_id
WHERE pf.name = 'MoviesPartitionFunction';
結果:
+---------------+---------+ | boundary_id | value | |---------------+---------| | 1 | -1 | | 2 | 100 | | 3 | 10000 | +---------------+---------+
予想どおり、境界範囲500が削除され、境界範囲は3つだけになりました。
データがパーティション間でどのように分散されるかを見てみましょう。
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
結果:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 3979 | | 4 | 0 | +--------------------+-------------+
予想どおり、パーティション3と4のデータは1つのパーティション(パーティション3)にマージされました。
パーティションが空なのはなぜですか?
両端に空のパーティションがある理由がわからない場合は、これは特にパーティションの分割とマージを容易にするために行われます。
両端でパーティションを空にしておくと、パーティションを分割またはマージするときに発生する可能性のある予期しないデータ移動を防ぐことができます。
この方法は、まさにこの理由から、Microsoftによっても推奨されています。
データを含むパーティションのマージ
前述のように、Microsoftは、すでにデータが含まれているパーティションをマージしないことをお勧めします。
移入されたパーティションの分割またはマージは非効率的である可能性があります。分割またはマージによりログが4倍も生成され、深刻なロックが発生する可能性があるため、非効率になる可能性があります。