このトピックでは、リストパーティションテーブルまたはレンジパーティションテーブルでの迷走値の処理方法について説明します。
DEFAULTまたはMAXVALUEパーティションまたはサブパーティションは、テーブルに定義されている他のパーティション分割ルールと一致しない行をキャプチャします。
DEFAULTパーティションの定義
DEFAULTパーティションは、list-partitionedまたはlist-subpartitionedテーブル内の他のパーティションに収まらない行をキャプチャします。 DEFAULTルールを含めない場合、パーティション分割ルールと一致しない値を含む行はエラーを引き起こします。 リスト分割テーブル内の各パーティションまたはリスト分割テーブル内のサブパーティションは、独自のDEFAULTルールを有することができる。
DEFAULTルールの構文は次のとおりです。
PARTITION partition_name VALUES (DEFAULT)
partition_nameは、他のパーティションに指定されたパーティション分割ルールと一致しない行を格納するために使用されるパーティションまたはサブパーティションの名前を指定します。
最後の例では、リスト分割テーブルが作成されます。 サーバは、country列の値に基づいて、このパーティションテーブルのどのパーティションにデータを格納するかを決定します。 country列の値がルールにリストされていない行を追加しようとすると、PolarDBはエラーを報告します:
acctg=# INSERT INTO sales VALUES
acctg-# (40、'3000x' 、'IRELAND' 、'01-Mar-2012 '、'45000');
ERROR: 挿入されたパーティションキーがどのパーティション
にもマップされません次の例では、同じテーブルが作成され、DEFAULTパーティションがテーブルに追加されます。 パーティション分割ルールは、europe、asia、またはamericasパーティションに格納される値を指定するために使用されます。 行の値がルールで指定されていない場合、サーバーはその行を他のパーティションに格納します。
テーブルの販売を作成する
(
dept_no number,
part_no varchar2,
country varchar2(20),
date date,
金額番号
)
リストによるパーティー (国)
(
PARTITION europe VALUES('FRANCE', 'ITALY'),
PARTITION asia VALUES('INDIA', 'PAKISTAN'),
PARTITION americas VALUES('US', 'CANADA'),
PARTITIONその他の価値 (デフォルト)
);
DEFAULTパーティションをテストするには、country列の値がパーティショニングルールで指定された国と一致しない行を追加します。
INSERT INTO sales VALUES
(40、'3000x' 、'IRELAND' 、'01-Mar-2012 '、'45000');
salesテーブルをクエリして、以前に拒否された行がsales_othersパーティションに格納されているかどうかを確認できます。
acctg=# SELECT tableid::regclass、* FROM sales;
tableoid | dept_no | part_no | 国 | 日付 | 金額
---------------- -------- ---------- ----------------- -------------------- -------------
sales_others | 40 | 3000x | アイルランド | 01-MAR-12 00:00:00 | 45000
(18行)
PolarDBは、DEFAULTパーティションまたはサブパーティションのコンテンツを再割り当てできないことに注意してください。
- ALTER TABLE...ADD PARTITIONコマンドを実行して、DEFAULTルールを持つテーブルにパーティションを追加することはできません。 ただし、ALTER TABLE...SPLIT PARTITIONコマンドを実行して、既存のパーティションを分割できます。
- ALTER TABLE...ADD SUBPARTITIONコマンドを実行して、DEFAULTルールを持つテーブルにサブパーティションを追加することはできません。 ただし、ALTER TABLE...SPLIT SUBPARTITIONコマンドを実行して、既存のサブパーティションを分割できます。
MAXVALUE パーティションの定義
MAXVALUEパーティションまたはサブパーティションは、range-partitionedまたはrange-subpartitionedテーブル内の他のパーティションに収まらない行をキャプチャします。 MAXVALUEルールを含めない場合、パーティション分割ルールで指定された上限を超える値が行に含まれるとエラーが発生します。 各パーティションまたはサブパーティションは、独自のMAXVALUEパーティションを有することができる。
PolarDBはMAXVALUEパーティションまたはサブパーティションのコンテンツを再割り当てできないことに注意してください。
- ALTER TABLEを実行できません... MAXVALUEルールを持つテーブルにパーティションを追加するためのADD PARTITIONステートメント。 ただし、ALTER TABLEを実行できます... 既存のパーティションを分割するSPLIT PARTITIONステートメント。
- ALTER TABLEを実行できません... SUBPARTITIONステートメントを追加して、MAXVALUEルールを持つテーブルにサブパーティションを追加します。 ただし、ALTER TABLEを実行できます... 既存のサブパーティションを分割するSPLIT SUBPARTITIONステートメント。
MAXVALUEルールの構文は次のとおりです。
PARTITION partition_name VALUES LESS THAN (MAXVALUE)
構文では、partition_nameは、他のパーティションに指定されたパーティション分割ルールと一致しない行を格納するために使用されるパーティションの名前を指定します。
最後の例では、範囲分割テーブルが作成されます。 このテーブルのデータは、日付列の値に基づいて分割されます。 日付値がパーティショニングルールで指定された日付値より後の行を追加しようとすると、PolarDBはエラーを報告します:
acctg=# INSERT INTO sales VALUES
acctg-# (40、'3000x' 、'IRELAND' 、'01-Mar-2013 '、'45000');
ERROR: 挿入されたパーティションキーがどのパーティション
にもマップされません次のCREATE TABLEコマンドは同じテーブルを作成しますが、このテーブルにはMAXVALUEパーティションがあります。 エラーを報告する代わりに、サーバーは他のパーティションの以前のパーティション分割ルールと一致しないすべての行を保存します。
テーブルの販売を作成する
(
dept_no number,
part_no varchar2,
country varchar2(20),
date date,
金額番号
)
範囲によるパーティー (日付)
(
PARTITION q1_2012 VALUES LESS THAN('2012-Apr-01'),
PARTITION q2_2012 VALUES LESS THAN('2012-Jul-01'),
PARTITION q3_2012 VALUES LESS THAN('2012-Oct-01'),
PARTITION q4_2012 VALUES LESS THAN('2013-Jan-01'),
他の参加者はより少ない値 (最大値)
);
MAXVALUEパーティションをテストするには、日付列の値が各パーティション分割ルールにリストされている最後の日付値より後の行を追加します。 サーバーは、この行を他のパーティションに格納します。
INSERT INTO sales VALUES
(40、'3000x' 、'IRELAND' 、'2015-Oct-01 '、'45000');
salesテーブルをクエリして、以前に拒否された行がsales_othersパーティションに格納されているかどうかを確認できます。
acctg=# SELECT tableid::regclass、* FROM sales;
tableoid | dept_no | part_no | 国 | 日付 | 金額
-------------- ----------------------------------------- -------------------- --------------
sales_q1_2012 | 10 | 4519b | フランス | 17-JAN-12 00:00:00 | 45000
sales_q1_2012 | 20 | 3788a | インド | 01-MAR-12 00:00:00 | 75000
sales_q1_2012 | 30 | 9519b | カナダ | 01-FEB-12 00:00:00 | 75000
sales_q2_2012 | 40 | 9519b | 米国 | 12-APR-12 00:00:00 | 145000
sales_q2_2012 | 20 | 3788a | パキスタン | 04-JUN-12 00:00:00 | 37500
sales_q2_2012 | 30 | 4519b | カナダ | 08-APR-12 00:00:00 | 120000
sales_q2_2012 | 40 | 3788a | 米国 | 5月12日-12 00:00:00 | 4950
sales_q3_2012 | 10 | 9519b | イタリア | 07-JUL-12 00:00:00 | 15000
sales_q3_2012 | 10 | 9519a | フランス | 18-AUG-12 00:00:00 | 650000
sales_q3_2012 | 10 | 9519b | フランス | 18-AUG-12 00:00:00 | 650000
sales_q3_2012 | 20 | 3788b | インド | 21-SEP-12 00:00:00 | 5090
sales_q3_2012 | 40 | 4788a | 米国 | 23-SEP-12 00:00:00 | 4950
sales_q4_2012 | 40 | 4577b | 米国 | 11-NOV-12 00:00:00 | 25000
sales_q4_2012 | 30 | 7588b | カナダ | 14-DEC-12 00:00:00 | 50000
sales_q4_2012 | 40 | 4788b | 米国 | 09-OCT-12 00:00:00 | 15000
sales_q4_2012 | 20 | 4519a | インド | 18-OCT-12 00:00:00 | 650000
sales_q4_2012 | 20 | 4519b | インド | 02-DEC-12 00:00:00 | 5090
sales_others | 40 | 3000x | アイルランド | 01-MAR-13 00:00:00 | 45000
(18行)