ニュース&ブログ
【SQL Server】パーティションテーブルの管理方法
投稿日:2025/01/28
はじめに
前回のブログではSQL Serverにおけるパーティショニング機能に関する概要と作成方法、パーティションテーブルの簡単な性能について確認しました。
今回はパーティションの管理で使用する「スライディング ウィンドウ」と呼ばれる操作を紹介いたします。
スライディング ウィンドウとは
古いパーティションテーブルのデータを定期的にアーカイブテーブルへ移動させることができる操作となります。
この操作自体がデータの物理的に更新ではなく、メタデータのみの更新となるため処理が高速です。
そのため、移行元テーブルと移行先テーブルは同一のファイルグループかつ定義情報も一致している必要があるので注意しましょう
以下、操作を実現するために必要なコマンドについての概要を記載します。
- SWITCH
パーティション間でデータを効率的に移動させるために使用されます。
この機能を利用することで、パーティション化されたテーブルから別のテーブルへ、或いはその逆に、パーティション単位でデータを移動することが可能になります。
- MERGE
複数のパーティションを1つに統合するために使用されます。
具体的には、隣接するパーティションを結合して新しいパーティションとして作成することが可能です。
この機能を利用することで、多数のパーティションを管理する際に便利になり、手間を減少させることに役立ちます。
ただし、統合する際には元のパーティションのデータが失われてしまうため注意が必要です。
- SPLIT
既存のパーティションに対して新しいパーティションを作成するために使用されます。
検証
スライディング ウィンドウの検証のために、前回使用したパーティションテーブルに加え新たにアーカイブテーブルを作成してから検証を進めます。
-- アーカイブ用のテーブルを作成
CREATE TABLE ArchPartitionedTable (
LogID INT,
LogDate DATE,
LogDataData nvarchar(1000),
) ON LogDatePartitionScheme (LogDate);
準備ができたので検証を始めます。
はじめにパーティション関数に対して新たに新規のパーティションをSPLITを使って作成します。
-- 新規パーティションを作成
ALTER PARTITION FUNCTION LogDatePartitionFunction() SPLIT RANGE ('2024/01/01');
続いてSWITCHを使い、パーティションテーブルの2023/01/01のデータをアーカイブテーブルに移動します。
-- パーティションテーブルからアーカイブテーブルへデータ移動
ALTER TABLE MyPartitionedTable SWITCH PARTITION 2 TO ArchPartitionedTable PARTITION 2;
以下のクエリの結果から、意図したデータが正しく移動しているようですね。
-- アーカイブテーブルの確認
SELECT
LogDate,
COUNT(*) AS ArchLogDateCount
FROM ArchPartitionedTable
WHERE
LogDate LIKE '%2023-01%'
GROUP BY
LogDate
ORDER BY
LogDate;
-- パーティションテーブルの確認
SELECT
LogDate,
COUNT(*) AS MyPartLogDateCount
FROM MyPartitionedTable
WHERE
LogDate LIKE '%2023-01%'
GROUP BY
LogDate
ORDER BY
LogDate;
それでは新規に作成したパーティションの正常性を確認するため、2024/01のデータも投入します。
-- データ投入
INSERT INTO MyPartitionedTable VALUES ('100001','2024-01-01','Normal log entry 100000')
2023/01~が格納されていたパーティション番号が空っぽの状態で放置されてしまうため、MERGEを使用してパーティション統合を行います。
ALTER PARTITION FUNCTION LogDatePartitionFunction() MERGE RANGE('2023/01/01')
最後にパーティションの状態をチェックします。
-- 各パーティション毎のデータ件数の確認
SELECT
partition_number
,row_count
FROM sys.dm_db_partition_stats
WHERE OBJECT_NAME(OBJECT_ID) IN ('MyPartitionedTable','ArchPartitionedTable');
-- パーティション関数の定義確認
SELECT
f.name
,r.value,r.boundary_id
FROM sys.partition_range_values r
INNER JOIN sys.partition_functions f
ON r.function_id = f.function_id
SPLITによって新規にNo.13(MERGE前はNo.14)のパーティションが作成されており、新規データの1件が格納されていることが確認できます。
また、SWITCHによってパーティションテーブルのNo.1(MERGE前はNo.2)のパーティションに格納されていた2024/01~のデータがアーカイブテーブルのNo.1(MERGE前はNo.2)のパーティションにデータ移動していることも確認できますね。
そして、MERGEで不要になった2024/01のパーティションが2024/02に統合されています。
まとめ
パーティショニング機能を利用することで大規模なテーブルのクエリパフォーマンスを向上させることはできるものの、当然管理をしていかなければいけません。
今回紹介したコマンドを定期的に実行していくことでパーティションテーブルを適切に運用することができるかと思います。
中川 智文(2022年入社)
株式会社システムサポート フューチャーイノベーション事業本部 ソリューションサービス事業部所属
Oracle Database, SQL Serverを中心とした案件に従事