このドキュメントでは、パーティションの作成戦略と削除戦略について説明します。
パーティション作成ポリシー
注意
- テーブルがテーブルグループ(tablegroup)に属している場合、パーティションの作成は失敗するか、ロードバランシングを破壊する可能性があります。作成ポリシーの設定にはご注意ください。
- 新しいインデックスを作成すると、テーブルグループ(tablegroup)が無効になる可能性があります。これは、同一のテーブルグループに属するテーブルは完全に一致したパーティション構成を持たなければならないため、新しいパーティションの作成によってその状態が崩れ、テーブルグループが無効になることがあるためです。
カスタムパーティション作成ポリシー
カスタムパーティション作成ポリシーは、SQL式を用いてパーティションの上限値を生成するもので、以下の3つのステップに分かれます:
SQL式によるベース時間の取得:ベース時間とは、パーティション生成時に依存する開始時間を指します。
説明
パーティション計画の実行時間を開始時間とする場合:
now()またはsysdateを直接使用します。パーティション生成間隔の定義:パーティション計画はこの間隔を時間ステップとして用い、複数のパーティションを生成します。**間隔**入力ボックスに必要な間隔を入力すると、ODCは
${INTERVAL}式でその間隔を参照し、ステップ1で生成されたSQL式に加算します。対応するパーティションキー型のパーティション式の生成:ステップ1とステップ2で生成された時間型のSQL式を、対応するパーティションキーの実際の型に変換します(パーティションキーの型がSQL式の型と同じ場合は、この手順を省略できます)。
カスタムパーティション作成ポリシーでは変数参照がサポートされており、現在サポートされている式は以下の通りです:
式名 |
説明 |
例 |
|---|---|---|
| INTERVAL | 時間間隔。パーティション生成時のステップ幅を記述するために使用されます。ODCはランタイム時にこの変数参照を 作成ルール > 細則 > 間隔 の内容に置き換えます。 | ${INTERVAL} |
通常、**カスタム**方式でパーティションポリシーを作成する場合、非時間型のパーティションキーを時間型のように増分して新しいパーティションを生成する必要があることを示します。以下の表は、正しいSQL式を迅速に記述するのに役立ちます:
パーティションの上限値を生成する式の一覧 - MySQLモード
| パーティション式の例 | 説明 | 間隔 | パーティションの上限を計算するSQL式 |
... values less than ('2024') |
年単位で生成されます | 1 | date_format(now() + interval ${INTERVAL} year, '''%Y''') |
... values less than ('202401') |
年単位で生成されます | 1 | date_format(now() + interval ${INTERVAL} year, '''%Y01''') |
| 月単位で生成されます | 1 | date_format(now() + interval ${INTERVAL} month, '''%Y%m''') |
|
... values less than ('2024-01') |
年単位で生成されます | 1 | date_format(now() + interval ${INTERVAL} year, '''%Y-01''') |
| 月単位で生成されます | 1 | date_format(now() + interval ${INTERVAL} month, '''%Y-%m''') |
|
... values less than ('2024/01') |
年単位で生成されます | 1 | date_format(now() + interval ${INTERVAL} year, '''%Y/01''') |
| 月単位で生成されます | 1 | date_format(now() + interval ${INTERVAL} month, '''%Y/%m''') |
|
... values less than ('20240101') |
年単位で生成されます | 1 | date_format(now() + interval ${INTERVAL} year, '''%Y0101''') |
| 月単位で生成されます | 1 | date_format(now() + interval ${INTERVAL} month, '''%Y%m01''') |
|
| 日単位で生成されます | 1 | date_format(now() + interval ${INTERVAL} day, '''%Y%m%d''') |
|
... values less than ('2024-01-01') |
年単位で生成されます | 1 | date_format(now() + interval ${INTERVAL} year, '''%Y-01-01''') |
| 月単位で生成されます | 1 | date_format(now() + interval ${INTERVAL} month, '''%Y-%m-01''') |
|
| 日単位で生成されます | 1 | date_format(now() + interval ${INTERVAL} day, '''%Y-%m-%d''') |
|
... values less than ('2024/01/01') |
年単位で生成されます | 1 | date_format(now() + interval ${INTERVAL} year, '''%Y/01/01''') |
| 月単位で生成されます | 1 | date_format(now() + interval ${INTERVAL} month, '''%Y/%m/01''') |
|
| 日単位で生成されます | 1 | date_format(now() + interval ${INTERVAL} day, '''%Y/%m/%d''') |
|
... values less than ('2024-01-01 00:00:00') |
年単位で生成されます | 1 | date_format(now() + interval ${INTERVAL} year, '''%Y-01-01 00:00:00''') |
| 月単位で生成されます | 1 | date_format(now() + interval ${INTERVAL} month, '''%Y-%m-01 00:00:00''') |
|
| 日単位で生成されます | 1 | date_format(now() + interval ${INTERVAL} day, '''%Y-%m-%d 00:00:00''') |
|
... values less than ('2024/01/01 00:00:00') |
年単位で生成されます | 1 | date_format(now() + interval ${INTERVAL} year, '''%Y/01/01 00:00:00''') |
| 月単位で生成されます | 1 | date_format(now() + interval ${INTERVAL} month, '''%Y/%m/01 00:00:00''') |
|
| 日単位で生成されます | 1 | date_format(now() + interval ${INTERVAL} day, '''%Y/%m/%d 00:00:00''') |
|
... values less than (2024) |
年単位で生成されます | 1 | date_format(now() + interval ${INTERVAL} year, '%Y') |
... values less than (202401) |
年単位で生成されます | 1 | date_format(now() + interval ${INTERVAL} year, '%Y01') |
| 月次で生成 | 1 | date_format(now() + interval ${INTERVAL} month, '%Y%m') |
|
... values less than (20240101) |
年次で生成 | 1 | date_format(now() + interval ${INTERVAL} year, '%Y0101') |
| 月次で生成 | 1 | date_format(now() + interval ${INTERVAL} month, '%Y%m01') |
|
| 日次で生成 | 1 | date_format(now() + interval ${INTERVAL} day, '%Y%m%d') |
|
... values less than (1709222400)注:Unixタイムスタンプ |
年次で生成 | 1 | unix_timestamp(str_to_date(date_format(now() + interval ${INTERVAL} year, '%Y-01-01 00:00:00'), '%Y-%m-%d %H:%i:%s')) |
| 月次で生成 | 1 | unix_timestamp(str_to_date(date_format(now() + interval ${INTERVAL} month, '%Y-%m-01 00:00:00'), '%Y-%m-%d %H:%i:%s')) |
|
| 日次で生成 | 1 | unix_timestamp(str_to_date(date_format(now() + interval ${INTERVAL} day, '%Y-%m-%d 00:00:00'), '%Y-%m-%d %H:%i:%s')) |
パーティションの上限値を生成する式の一覧 - Oracleモード
| パーティション式の例 | 説明 | 間隔 | パーティションの上限を計算するSQL式 |
... values less than ('2024') |
年単位で生成 | NUMTOYMINTERVAL(1, 'YEAR') |
TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY''') |
... values less than ('202401') |
年単位で生成 | NUMTOYMINTERVAL(1, 'YEAR') |
TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY"01"''') |
| 月単位で生成 | NUMTOYMINTERVAL(1, 'MONTH') |
TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYYMM''') |
|
... values less than ('2024-01') |
年単位で生成 | NUMTOYMINTERVAL(1, 'YEAR') |
TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY-"01"''') |
| 月単位で生成 | NUMTOYMINTERVAL(1, 'MONTH') |
TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY-MM''') |
|
... values less than ('2024/01') |
年単位で生成 | NUMTOYMINTERVAL(1, 'YEAR') |
TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY/"01"''') |
| 月単位で生成 | NUMTOYMINTERVAL(1, 'MONTH') |
TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY/MM''') |
|
... values less than ('20240101') |
年単位で生成 | NUMTOYMINTERVAL(1, 'YEAR') |
TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY"01""01"''') |
| 月単位で生成 | NUMTOYMINTERVAL(1, 'MONTH') |
TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYYMM"01"''') |
|
| 日単位で生成 | NUMTODSINTERVAL(1, 'DAY') |
TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYYMMDD''') |
|
... values less than ('2024-01-01') |
年単位で生成 | NUMTOYMINTERVAL(1, 'YEAR') |
TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY-"01"-"01"''') |
| 月単位で生成 | NUMTOYMINTERVAL(1, 'MONTH') |
TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY-MM-"01"''') |
|
| 日単位で生成 | NUMTODSINTERVAL(1, 'DAY') |
TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY-MM-DD''') |
|
... values less than ('2024/01/01') |
年単位で生成 | NUMTOYMINTERVAL(1, 'YEAR') |
TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY/"01"/"01"''') |
| 月単位で生成 | NUMTOYMINTERVAL(1, 'MONTH') |
TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY/MM/"01"''') |
|
| 日単位で生成 | NUMTODSINTERVAL(1, 'DAY') |
TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY/MM/DD''') |
|
... values less than ('2024-01-01 00:00:00') |
年単位で生成 | NUMTOYMINTERVAL(1, 'YEAR') |
TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY-"01"-"01 00:00:00"''') |
| 月単位で生成 | NUMTOYMINTERVAL(1, 'MONTH') |
TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY-MM-"01 00:00:00"''') |
|
| 日単位で生成 | NUMTODSINTERVAL(1, 'DAY') |
TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY-MM-DD "00:00:00"''') |
|
... values less than ('2024/01/01 00:00:00') |
年単位で生成 | NUMTOYMINTERVAL(1, 'YEAR') |
TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY/"01"/"01 00:00:00"''') |
| 月単位で生成 | NUMTOYMINTERVAL(1, 'MONTH') |
TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY/MM/"01 00:00:00"''') |
|
| 日単位で生成 | NUMTODSINTERVAL(1, 'DAY') |
TO_CHAR(SYSDATE + ${INTERVAL}, '''YYYY/MM/DD "00:00:00"''') |
|
... values less than (2024) |
年単位で生成されます | NUMTOYMINTERVAL(1, 'YEAR') |
TO_CHAR(SYSDATE + ${INTERVAL}, 'YYYY') |
... values less than (202401) |
年単位で生成されます | NUMTOYMINTERVAL(1, 'YEAR') |
TO_CHAR(SYSDATE + ${INTERVAL}, 'YYYY"01"') |
| 月単位で生成されます | NUMTOYMINTERVAL(1, 'MONTH') |
TO_CHAR(SYSDATE + ${INTERVAL}, 'YYYYMM') |
|
... values less than (20240101) |
年単位で生成されます | NUMTOYMINTERVAL(1, 'YEAR') |
TO_CHAR(SYSDATE + ${INTERVAL}, 'YYYY"01""01"') |
| 月単位で生成されます | NUMTOYMINTERVAL(1, 'MONTH') |
TO_CHAR(SYSDATE + ${INTERVAL}, 'YYYYMM"01"') |
|
| 日単位で生成されます | NUMTODSINTERVAL(1, 'DAY') |
TO_CHAR(SYSDATE + ${INTERVAL}, 'YYYYMMDD') |
シーケンシャルインクリメントパーティション作成ポリシー
シーケンシャルインクリメントは、数値型、時刻型、および文字列型のパーティションキーに対して便利な管理操作を可能にします。シーケンシャルインクリメントのベース時間は現在時刻または指定時刻を基準とし、ユーザーが設定した時間間隔で新しいパーティションを順次生成します。
パーティション名の生成ポリシー
ユーザーはさまざまなポリシーを使用してパーティション名を生成でき、パーティション名の生成はパーティションの内容と関連付けられます。
パーティション計画では現在、2種類のパーティション名生成ポリシーを提供しています:
プレフィックス+サフィックスポリシー:プレフィックスは文字列定数、サフィックスは日付型パーティション式への参照です。ユーザーはプレフィックスとサフィックスの内容、ベース時間、出力フォーマットを変更することで、異なるパーティション名を取得できます。

注意
このポリシーは日付型のパーティションキーにのみ有効です。サフィックスは、指定されたパーティションキーに対応するSQL式の値を参照します。参照するパーティションキーが時刻型であるため、対応するSQL式は時刻に変換され、最終的にパーティション名のサフィックス部分としてフォーマットされて出力されます。
カスタムポリシー:このポリシーはSQL式を使用して、ユーザーの要件に合ったパーティション名を生成します。命名式では、
${パーティションキー}のように書くことで、パーティションキーに対応するパーティション式の値を参照できます。
以下は一般的なパーティション名の生成式のクイックチェック表です。ODCは、数値型および文字列型のパーティションキーのみをサポートしています。
パーティション名生成式クイックリファレンス - MySQLモード
| 参照パーティション式の例 | 命名規則式 | プレビュー |
... values less than (..., 2024, ...) |
concat('P', ${パーティションキー}) |
P2024 |
... values less than (..., '2024', ...) |
||
... values less than (..., 202401, ...) |
concat('P', ${パーティションキー}) |
P202401 |
... values less than (..., '202401', ...) |
||
... values less than (..., '2024-01', ...) |
date_format(str_to_date(concat(${パーティションキー}, '-01'), '%Y-%m-%d'), 'P%Y%m') |
P202401 |
date_format(str_to_date(concat(${パーティションキー}, '-01'), '%Y-%m-%d'), 'P%Y_%m') |
P2024_01 | |
... values less than (..., '2024/01', ...) |
date_format(str_to_date(concat(${パーティションキー}, '/01'), '%Y/%m/%d'), 'P%Y%m') |
P202401 |
date_format(str_to_date(concat(${パーティションキー}, '/01'), '%Y/%m/%d'), 'P%Y_%m') |
P2024_01 | |
... values less than (..., 20240101, ...) |
concat('P', ${パーティションキー}) |
P20240101 |
... values less than (..., '20240101', ...) |
||
... values less than (..., '2024-01-01', ...) |
date_format(str_to_date(${パーティションキー}, '%Y-%m-%d'), 'P%Y%m%d') |
P20240101 |
date_format(str_to_date(${パーティションキー}, '%Y-%m-%d'), 'P%Y_%m_%d') |
P2024_01_01 | |
... values less than (..., '2024/01/01', ...) |
date_format(str_to_date(${パーティションキー}, '%Y/%m/%d'), 'P%Y%m%d') |
P20240101 |
date_format(str_to_date(${パーティションキー}, '%Y/%m/%d'), 'P%Y_%m_%d') |
P2024_01_01 | |
... values less than (..., '2024-01-01 00:00:00', ...) |
date_format(str_to_date(${パーティションキー}, '%Y-%m-%d %H:%i:%s'), 'P%Y%m%d') |
P20240101 |
date_format(str_to_date(${パーティションキー}, '%Y-%m-%d %H:%i:%s'), 'P%Y_%m_%d') |
P2024_01_01 | |
... values less than (..., '2024/01/01 00:00:00', ...) |
date_format(str_to_date(${パーティションキー}, '%Y/%m/%d %H:%i:%s'), 'P%Y%m%d') |
P20240101 |
date_format(str_to_date(${パーティションキー}, '%Y/%m/%d %H:%i:%s'), 'P%Y_%m_%d') |
P2024_01_01 | |
... values less than (..., 1709222400, ...)注:タイムスタンプ、単位:秒 |
date_format(from_unixtime(${パーティションキー}), 'P%Y') |
P2024 |
date_format(from_unixtime(${パーティションキー}), 'P%Y%m') |
P202401 | |
date_format(from_unixtime(${パーティションキー}), 'P%Y_%m') |
P2024_01 | |
date_format(from_unixtime(${パーティションキー}), 'P%Y%m%d') |
P20240101 | |
date_format(from_unixtime(${パーティションキー}), 'P%Y_%m_%d') |
P2024_01_01 |
パーティション名生成式クイックリファレンス - Oracleモード
| 参照パーティション式の例 | 命名規則式 | プレビュー |
... values less than (..., 2024, ...) |
concat('P', ${パーティションキー}) |
P2024 |
... values less than (..., '2024', ...) |
||
... values less than (..., 202401, ...) |
concat('P', ${パーティションキー}) |
P202401 |
... values less than (..., '202401', ...) |
||
... values less than (..., '2024-01', ...) |
TO_CHAR(TO_DATE(CONCAT(${パーティションキー}, '-01'), 'YYYY-MM-DD'), '"P"YYYYMM') |
P202401 |
TO_CHAR(TO_DATE(CONCAT(${パーティションキー}, '-01'), 'YYYY-MM-DD'), '"P"YYYY_MM') |
P2024_01 | |
... values less than (..., '2024/01', ...) |
TO_CHAR(TO_DATE(CONCAT(${パーティションキー}, '/01'), 'YYYY/MM/DD'), '"P"YYYYMM') |
P202401 |
TO_CHAR(TO_DATE(CONCAT(${パーティションキー}, '/01'), 'YYYY/MM/DD'), '"P"YYYY_MM') |
P2024_01 | |
... values less than (..., 20240101, ...) |
concat('P', ${パーティションキー}) |
P20240101 |
... values less than (..., '20240101', ...) |
||
... values less than (..., '2024-01-01', ...) |
TO_CHAR(TO_DATE(${パーティションキー}, 'YYYY-MM-DD'), '"P"YYYYMMDD') |
P20240101 |
TO_CHAR(TO_DATE(${パーティションキー}, 'YYYY-MM-DD'), '"P"YYYY_MM_DD') |
P2024_01_01 | |
... values less than (..., '2024/01/01', ...) |
TO_CHAR(TO_DATE(${パーティションキー}, 'YYYY/MM/DD'), '"P"YYYYMMDD') |
P20240101 |
TO_CHAR(TO_DATE(${パーティションキー}, 'YYYY/MM/DD'), '"P"YYYY_MM_DD') |
P2024_01_01 | |
... values less than (..., '2024-01-01 00:00:00', ...) |
TO_CHAR(TO_DATE(${パーティションキー}, 'YYYY-MM-DD HH24:MI:SS'), '"P"YYYYMMDD') |
P20240101 |
TO_CHAR(TO_DATE(${パーティションキー}, 'YYYY-MM-DD HH24:MI:SS'), '"P"YYYY_MM_DD') |
P2024_01_01 | |
... values less than (..., '2024/01/01 00:00:00', ...) |
TO_CHAR(TO_DATE(${パーティションキー}, 'YYYY/MM/DD HH24:MI:SS'), '"P"YYYYMMDD') |
P20240101 |
TO_CHAR(TO_DATE(${パーティションキー}, 'YYYY/MM/DD HH24:MI:SS'), '"P"YYYY_MM_DD') |
P2024_01_01 |
パーティション削除ポリシー
注意
- テーブルにグローバルインデックスが含まれている場合、パーティションを削除するとグローバルインデックスが無効になります。慎重に操作してください。グローバルインデックスの再作成を選択した場合、時間がかかりすぎてビジネス上の問題が発生したり、再作成に失敗してオンラインで問題が生じたりする可能性があります。
- グローバルインデックスの再作成オプションはOracleモードでのみ有効です。MySQLモードではこのオプションはなく、MySQLモードではデフォルトでグローバルインデックスが再作成されます。
- パーティション削除ポリシーでは、事前に作成されたパーティションの影響を考慮し、それによって過去のパーティションが誤って削除されるのを防ぐ必要があります。例えば、対象テーブルが月単位でパーティション化されており、過去12ヶ月分のパーティションを保持したい場合、パーティション保持数に12を入力します。この時、作成ポリシーで3ヶ月分のパーティションを事前に作成する設定だと、実際には過去9ヶ月分と今後3ヶ月分のパーティションが保持されます。
パーティション削除ポリシーは既存のパーティションに対して適用され、現在は1つのポリシーのみがサポートされています:最後のN個のパーティションを保持し、それ以外のパーティションを削除します。
例:
orderテーブルを作成し、p2023_01とp2023_02の2つのパーティションを含めます。CREATE TABLE `order` ( `time` date NOT NULL, `parti_key` int(11), `name` varchar(120) DEFAULT NULL ) partition by range columns(time, parti_key) (partition p2023_01 values less than ('2023-01-01', 20230101), partition p2023_02 values less than ('2023-02-01', 20230201))orderテーブルにパーティション削除ポリシー(最後の1個のパーティションを保持する)を設定します。パーティション削除ポリシーに基づいて生成されるパーティション削除ステートメントは、
p2023_01パーティションを削除します。
注意点
テーブルがテーブルグループ(tablegroup)に属している場合、パーティションの作成が失敗したり、ロードバランシングが破壊されたりする可能性があります。作成ポリシーの設定にはご注意ください。
新規インデックスの作成により、テーブルグループ(tablegroup)が無効になる可能性があります。これは、同一のテーブルグループに属するテーブルは完全に一致したパーティション構成を持つ必要があり、新規パーティションの作成がその状態を崩し、結果としてテーブルグループが無効になるためです。
テーブルにグローバルインデックスが含まれている場合、パーティションの削除によりグローバルインデックスが無効になる可能性があります。操作にはご注意ください。グローバルインデックスの再作成を選択した場合、時間がかかりすぎてビジネス上の問題が発生したり、再作成に失敗してオンラインで問題が生じたりする可能性があります。
グローバルインデックスの再作成オプションはOracleモードでのみ有効です。MySQLモードではこのオプションはなく、MySQLモードではデフォルトでグローバルインデックスが再作成されます。