SQL Serverにパーティション化されたテーブルまたはインデックスがあり、さらにパーティションが必要な場合は、ALTER PARTITION FUNCTION
を使用してパーティション関数にパーティションを追加できます。 SPLIT RANGE
を含むステートメント 引数。
これを行うときは、既存のパーティションを2つに分割します。
例
これがデモンストレーションの例です。まず、現在の設定を見てみましょう。
現在の設定
すでに4つのパーティションがあり、5つ目を追加したいと思います。
したがって、次のようなパーティション関数をすでに作成しています:
CREATE PARTITION FUNCTION MoviesPartitionFunction (int)
AS RANGE LEFT FOR VALUES (-1, 100, 10000);
このコードにより、次のように値を格納するパーティションが作成されます。
パーティション | 値 |
---|---|
1 | <=– 1 |
2 | > – 1 AND <=100 |
3 | > 100 AND <=10000 |
4 | > 10000 |
この例では、500という新しい境界値を追加します。
したがって、次のように表示する必要があります:
パーティション | 値 |
---|---|
1 | <=– 1 |
2 | > – 1 AND <=100 |
3 | > 100 AND <=500 |
4 | > 500 AND <=10000 |
5 | > 10000 |
また、この例の目的のために、上記のパーティション関数を使用してパーティション化されたテーブルがあり、現在、4000行をわずかに超えるデータが含まれていると想像してください。
行がパーティション全体にどのように分散されているかを簡単に見てみましょう。
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 | +--------------------+-------------+
そこで、境界値が500の新しいパーティションを追加します。
この場合、パーティションを境界値100と10000の間で分割します。
マイクロソフトは、データが入力されたパーティションを分割しないことを推奨していることを述べておく必要があります。ですから、それは覚えておくべきことです。
ただし、この例では、データを含むパーティションを分割します。
パーティションを分割する
ここで、パーティションを分割します。
ALTER PARTITION FUNCTION
を使用します パーティションを分割するステートメント。
ただし、パーティションを分割すると、1つから2つのパーティションが作成されるため、新しいパーティションのファイルグループがあることを確認する必要があります。また、パーティションを分割するときに、パーティションスキームが使用するファイルグループを認識していることを確認する必要があります。
既存のファイルグループを使用することも、新しいファイルグループを作成することもできます。
新しいものを作成しましょう。
上記のすべてを実行するために使用できるコードは次のとおりです。
ALTER DATABASE Test ADD FILEGROUP MoviesFg5;
ALTER DATABASE Test
ADD FILE
(
NAME = MoviesFg5dat,
FILENAME = '/var/opt/mssql/data/MoviesFg5dat.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP MoviesFg5;
ALTER PARTITION SCHEME MoviesPartitionScheme
NEXT USED MoviesFg5;
ALTER PARTITION FUNCTION MoviesPartitionFunction()
SPLIT 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 | 500 | | 4 | 10000 | +---------------+---------+
これで、新しい境界値が正常に追加されたことがわかります。
そして、これがデータがパーティション間でどのように分散されるかを示しています。
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 | +--------------------+-------------+
これで、5つのパーティションができました。
パーティションが空なのはなぜですか?
両端に空のパーティションがある理由がわからない場合は、これは特にパーティションの分割とマージを容易にするために行われます。
両端でパーティションを空にしておくと、パーティションを分割またはマージするときに発生する可能性のある予期しないデータ移動を防ぐことができます。
この方法は、まさにこの理由から、Microsoftによっても推奨されています。
データを含むパーティションの分割
前述のように、Microsoftは、すでにデータが含まれているパーティションを分割しないことをお勧めします。
移入されたパーティションの分割またはマージは非効率的である可能性があります。分割またはマージによりログが4倍も生成され、深刻なロックが発生する可能性があるため、非効率になる可能性があります。