すべてのプロダクト
Search
ドキュメントセンター

PolarDB:パーティションの再編成

最終更新日:Mar 11, 2025

このトピックでは、リストパーティションまたは範囲パーティションテーブルのパーティションとサブパーティションを再編成し、データ損失なしで自動データ分散を有効にする方法について説明します。

パーティションの分割

-- 既存のパーティション p2019_2020 を 2 つの新しいパーティション 2019 と 2020 に分割します。
ALTER TABLE sales_data
REORGANIZE PARTITION p2019_2020 INTO (
    PARTITION p2019 VALUES LESS THAN (2020) (
        SUBPARTITION s2019_q1,
        SUBPARTITION s2019_q2,
        SUBPARTITION s2019_q3,
        SUBPARTITION s2019_q4
    ),
    PARTITION p2020 VALUES LESS THAN (2021) (
        SUBPARTITION s2020_q1,
        SUBPARTITION s2020_q2,
        SUBPARTITION s2020_q3,
        SUBPARTITION s2020_q4
    )
);

パーティションのマージ

-- パーティション p2021 と p2022 をマージします。
ALTER TABLE sales_data
REORGANIZE PARTITION p2021, p2022 INTO (
    PARTITION p2021_2022 VALUES LESS THAN (2023) (
        SUBPARTITION s2021_2022_q1,
        SUBPARTITION s2021_2022_q2,
        SUBPARTITION s2021_2022_q3,
        SUBPARTITION s2021_2022_q4
    )
);
範囲値が隣接しているパーティションをマージできます。

パーティションの変更

-- 既存のパーティションを四半期範囲に基づいて 4 つの新しいパーティションに再編成します。
ALTER TABLE logs
REORGANIZE PARTITION p0, p1 INTO (
    PARTITION q1 VALUES LESS THAN (TO_DAYS('2023-04-01')),
    PARTITION q2 VALUES LESS THAN (TO_DAYS('2023-07-01')),
    PARTITION q3 VALUES LESS THAN (TO_DAYS('2023-10-01')),
    PARTITION q4 VALUES LESS THAN (TO_DAYS('2024-01-01'))
);

構文

ALTER TABLE table_name
    REORGANIZE PARTITION partition_names INTO (partition_definitions)

partition_definitions: {list_partition | range_partition}

subpartition_definition: {list_subpartition | range_subpartition | hash_subpartition | key_subpartition}

パーティションの定義

  • リストパーティションを定義します。

    PARTITION partition_name VALUES IN (value[, value]...) 
    (subpartition, ...)
  • 範囲パーティションを定義します。

    PARTITION partition_name VALUES LESS THAN (value[, value]...) 
    (subpartition, ...)

サブパーティションの定義

  • リストサブパーティションを定義します。

    SUBPARTITION [subpartition_name] VALUES IN (value[, value]...) 
    [TABLESPACE tablespace_name]
  • 範囲サブパーティションを定義します。

    SUBPARTITION [subpartition_name] VALUES LESS THAN (value[, value]...) 
    [TABLESPACE tablespace_name]
  • ハッシュまたはキースタイルのサブパーティションを定義します。

    SUBPARTITION [subpartition_name ]
    [TABLESPACE tablespace_name]

パラメータ

説明

table_name

テーブルの名前。

partition_names

マージまたは分割する既存のパーティション名のリスト(コンマ区切り)。

partition_definitions

新しいパーティション定義のリスト(コンマ区切り)。

partition_name

作成するパーティションの名前。

説明

パーティション名は、すべてのパーティションとサブパーティションで一意である必要があり、オブジェクト識別子の命名規則に従う必要があります。

subpartition_name

作成するサブパーティションの名前。

説明

サブパーティション名は、すべてのパーティションとサブパーティションで一意である必要があり、オブジェクト識別子の命名規則に従う必要があります。

データの準備

-- 年別にパーティション化され、四半期別にハッシュサブパーティション化された販売テーブルを作成します
CREATE TABLE sales_data (
    order_id INT AUTO_INCREMENT,
    order_date DATE NOT NULL,
    amount DECIMAL(10,2),
    PRIMARY KEY (order_id, order_date)  -- プライマリキーにはパーティションキーを含める必要があります
)
PARTITION BY RANGE (YEAR(order_date))
SUBPARTITION BY HASH( QUARTER(order_date) )
SUBPARTITIONS 4 (  -- 各親パーティションにはデフォルトで 4 つのサブパーティションがあります
    PARTITION p2019_2020 VALUES LESS THAN (2021),
    PARTITION p2021 VALUES LESS THAN (2022),
    PARTITION p2022 VALUES LESS THAN (2023),
    PARTITION p_future VALUES LESS THAN MAXVALUE
);

-- テストデータを挿入します
INSERT INTO sales_data (order_date, amount) VALUES
('2020-03-15', 100.00),  -- p2019_2020
('2021-06-20', 200.00),  -- p2021
('2022-09-10', 300.00),  -- p2022
('2023-12-25', 400.00);  -- p_future

パーティションの分割

p2019_2020 パーティションを p2019 パーティションと p2020 パーティションに分割します。

ALTER TABLE sales_data
REORGANIZE PARTITION p2019_2020 INTO (
    PARTITION p2019 VALUES LESS THAN (2020) (
        SUBPARTITION s2019_q1,
        SUBPARTITION s2019_q2,
        SUBPARTITION s2019_q3,
        SUBPARTITION s2019_q4
    ),
    PARTITION p2020 VALUES LESS THAN (2021) (
        SUBPARTITION s2020_q1,
        SUBPARTITION s2020_q2,
        SUBPARTITION s2020_q3,
        SUBPARTITION s2020_q4
    )
);

パーティションのマージ

p2021 パーティションと p2022 パーティションを 1 つの p2021_2022 パーティションにマージします。

ALTER TABLE sales_data
REORGANIZE PARTITION p2021, p2022 INTO (
    PARTITION p2021_2022 VALUES LESS THAN (2023) (
        SUBPARTITION s2021_2022_q1,
        SUBPARTITION s2021_2022_q2,
        SUBPARTITION s2021_2022_q3,
        SUBPARTITION s2021_2022_q4
    )
);

パーティションの変更

4 つのパーティション p2019p2020p2021_2022p_future を 3 つのパーティション p2019p2020_2021p2022_future に変更します。

ALTER TABLE sales_data
REORGANIZE PARTITION p2019, p2020, p2021_2022, p_future INTO (
    PARTITION p2019 VALUES LESS THAN (2020) (
        SUBPARTITION s2019_q1,
        SUBPARTITION s2019_q2,
        SUBPARTITION s2019_q3,
        SUBPARTITION s2019_q4
    ),
    PARTITION p2020_2021 VALUES LESS THAN (2022) (
        SUBPARTITION s2020_2021_q1,
        SUBPARTITION s2020_2021_q2,
        SUBPARTITION s2020_2021_q3,
        SUBPARTITION s2020_2021_q4
    ),
    PARTITION p2022_future VALUES LESS THAN MAXVALUE (
        SUBPARTITION s2022_future_1,
        SUBPARTITION s2022_future_2,
        SUBPARTITION s2022_future_3,
        SUBPARTITION s2022_future_4
    )
);