CREATE TABLEコマンドのPARTITION BY句を使用して、パーティションテーブルを作成できます。 このパーティションテーブルのデータは、1つ以上のパーティション (およびサブパーティション) に分散されます。
概要
CREATE TABLEコマンドの構文には、次の3つの形式があります。
- リストパーティション分割構文 最初の形式は、リストパーティションテーブルを作成することです:
create table [schema. ] table_name table_definition PARTITION BY リスト (列) [SUBPARTITION BY {RANGE | LIST} (column[, column ]...)] (list_partition_definition[, list_partition_definition]...) ;
list_partition_definitionは次のとおりです。PARTITION [partition_name] 値 (value[, value]...) [TABLESPACE tablespace_name] [(サブパーティション、...)]
- 範囲パーティション分割構文 2番目の形式は、範囲分割テーブルを作成することです。
] table_name table_definition RANGEによるパーティション (column[, column ]...) [SUBPARTITION BY {RANGE | LIST} (column[, column ]...)] (range_partition_definition[, range_partition_definition]...) ;
range_partition_definitionは、PARTITION [partition_name] です。 VALUES LESS THAN (value[, value]...) [ TABLESPACE [=] tablespace_name ] [(サブパーティション, ...)]
- サブパーティション分割構文 サブパーティションには、次の2つのタイプのいずれかがあります。
{list_subpartition | range_subpartition}
list_subpartitionは次のとおりです。SUBPARTITION [subpartition_name] VALUES (value[, value]...) [TABLESPACE tablespace_name]
range_subpartitionは次のとおりです。SUBPARTITION [subpartition_name] 未満の値 (value[, value]...) [TABLESPACE tablespace_name]
説明
The CREATE TABLE... PARTITION BYコマンドは、1つまたは複数のパーティションを持つテーブルを作成します。 各パーティションは、1つまたは複数のサブパーティションを有し得る。 定義されるパーティションの数は限定されない。 PARTITION BY句を含める場合は、最低1つのパーティション分割ルールを指定する必要があります。 結果のテーブルは、テーブルを作成したユーザーが所有しています。
PARTITION BY LIST句を使用して、指定した列に入力された値に基づいてテーブルをパーティションに分割します。 各パーティション分割ルールは、少なくとも1つのリテラル値を指定する必要があります。 指定できる値の数に制限はありません。 一致するDEFAULTの値を指定するルールを含めて、指定されたパーティションに修飾されていない行を転送します。
PARTITION BY RANGE句を使用して、作成されるパーティションに基づいて境界ルールを指定します。 各パーティション分割ルールには、2つの演算子を持つデータ型の少なくとも1つの列が含まれている必要があります (たとえば、演算子以上、演算子未満) 。 範囲境界はLESS THAN句に基づいて評価され、非包括的です。 2013 年 1 月 1 日の境界日時には、2012 年 12 月 31 日以前の日付値のみが含まれます。
範囲パーティション分割ルールは昇順で指定する必要があります。 INSERTコマンドが、レンジパーティションテーブルの最上位の境界を超える値の行を格納すると、コマンドは失敗します。 ただし、パーティショニングルールにMAXVALUEの値を指定する境界ルールが含まれている場合、コマンドは失敗しません。 MAXVALUEルールを含めない場合、境界ルールで指定された上限を超える行はエラーの原因となります。
TABLESPACEキーワードを使用して、パーティションまたはサブパーティションが存在するテーブルスペースの名前を指定します。 テーブルスペースを指定しない場合、パーティションまたはサブパーティションはデフォルトのテーブルスペースに作成されます。
CREATE TABLE構文を使用してパーティションテーブルにインデックスを作成すると、インデックスは各パーティションまたはサブパーティションに作成されます。
テーブル定義にSUBPARTITION BY句が含まれている場合、テーブル内の各パーティションには少なくとも1つのサブパーティションがあります。 各サブパーティションは、明示的に定義またはシステム定義できます。
- SUBPARTITION BY 句が LIST を指定している場合の DEFAULT サブパーティションです。
- SUBPARTITION BY 句が RANGE を指定している場合の MAXVALUE サブパーティションです。
サーバによって生成されるサブパーティション名は、パーティション名と一意の識別子との組み合わせである。 ALL_TAB_SUBPARTITIONS テーブルを照会して、サブパーティション名の完全なリストを表示することができます。
パラメーター
パラメーター | 説明 |
table_name | 作成するテーブルの名前 (オプションでスキーマ修飾) 。 |
table_definition | CREATE TABLE ステートメントのPostgreSQLコアドキュメントに記載されている列名、データ型、および制約情報。 |
partition_name | 作成するパーティションの名前。 パーティション名は、すべてのパーティションおよびサブパーティション間で一意である必要があり、オブジェクト識別子の命名規則に従う必要があります。 |
subpartition_name | 作成するサブパーティションの名前。 サブパーティション名は、すべてのパーティションおよびサブパーティション間で一意である必要があり、オブジェクト識別子の命名規則に従う必要があります。 |
column | パーティション分割ルールの基になる列の名前。 各行は、指定された列の値に対応するパーティションに格納されます。 |
(value[, value]...) |
リストパーティションテーブルのルールを指定する場合は、最後のパーティションルールに レンジパーティションテーブルのルールを指定する場合は、最後のパーティションルールに |
tablespace_name | パーティションまたはサブパーティションが存在するテーブルスペースの名前。 |
例 - PARTITION BY LIST
(
dept_no number,
part_no varchar2,
country varchar2(20),
date date,
金額番号
)
リストによるパーティー (国)
(
PARTITION europe VALUES('FRANCE', 'ITALY'),
PARTITION asia VALUES('INDIA', 'PAKISTAN'),
PARTITIONアメリカスバリュー (「米国」、「カナダ」)
);
で指定された値に基づいてパーティション分割されます。acctg=# SELECT partition_name, high_value from ALL_TAB_PARTITIONS;
partition_name | high_value
---------------- + ---------------------
アメリカ | 「米国」、「カナダ」
アジア | 'INDIA' 、'PAKISTAN'
ヨーロッパ | 「フランス」、「イタリア」
(3行)
- country 列の値が US または CANADA の行は、americas のパーティションに格納されます。
- country 列の値が INDIA または PAKISTAN の行は、asia のパーティションに格納されます。
- country 列の値が FRANCE または ITALY の行は、europe のパーティションに格納されます。
INSERT INTO sales VALUES (10、'9519a' 、'FRANCE' 、'18-Aug-2012 '、'650000');
例 - PARTITION BY RANGE
テーブルの販売を作成する
(
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
より少ない値 ('2013-Jan-01 ')
);
で指定された値に基づいてパーティション分割されます。acctg=# SELECT partition_name, high_value from ALL_TAB_PARTITIONS;
partition_name | high_value
---------------- ----------------
q4_2012 | '2013-Jan-01'
q3_2012 | '2012-Oct-01'
q2_2012 | '2012-Jul-01'
q1_2012 | '2012-Apr-01'
(4行)
- 2012 年 4 月 1 日より前の日付列の値を持つ行は、q1_2012 パーティションに格納されます。
- 2012 年 7 月 1 日より前の日付列の値を持つ行は、q2_2012 パーティションに格納されます。
- 2012 年 10 月 1 日より前の日付列の値を持つ行は、q3_2012 パーティションに格納されます。
- 2013 年 1 月 1 日より前の日付列の値を持つ行は、q4_2012 パーティションに格納されます。
INSERT INTO sales VALUES (10、'9519a' 、'FRANCE' 、'18-Aug-2012 '、'650000');
例-PARTITION BY RANGE、SUBPARTITION BY LIST
次の例では、トランザクション日付を使用して最初にパーティション分割されるパーティション分割テーブル (売上) を作成します。 次に、レンジパーティション (q1_2012、q2_2012、q3_2012、およびq4_2012) は、country列の値を使用してリスト分割されます。
テーブルの販売を作成する
(
dept_no number,
part_no varchar2,
country varchar2(20),
date date,
金額番号
)
範囲によるパーティー (日付)
SUBPARTITION BY LIST(country)
(
PARTITION q1_2012
VALUES LESS THAN('2012-Apr-01')
(
SUBPARTITION q1_europe VALUES ('FRANCE', 'ITALY'),
SUBPARTITION q1_asia VALUES ('INDIA', 'PAKISTAN'),
SUBPARTITION q1_americas VALUES ('US', 'CANADA')
),
PARTITION q2_2012
VALUES LESS THAN('2012-Jul-01')
(
SUBPARTITION q2_europe VALUES ('FRANCE', 'ITALY'),
SUBPARTITION q2_asia VALUES ('INDIA', 'PAKISTAN'),
SUBPARTITION q2_americas VALUES ('US', 'CANADA')
),
PARTITION q3_2012
VALUES LESS THAN('2012-Oct-01')
(
SUBPARTITION q3_europe VALUES ('FRANCE', 'ITALY'),
SUBPARTITION q3_asia VALUES ('INDIA', 'PAKISTAN'),
SUBPARTITION q3_americas VALUES ('US', 'CANADA')
),
PARTITION q4_2012
VALUES LESS THAN('2013-Jan-01')
(
SUBPARTITION q4_europe VALUES ('FRANCE', 'ITALY'),
SUBPARTITION q4_asia VALUES ('INDIA', 'PAKISTAN'),
SUBPARTITION q4_americas VALUES ('US', 'CANADA')
)
);
。acctg=# SELECT subpartition_name, high_value, partition_name FROM ALL_TAB_SUBPARTITIONS;
subpartition_name | high_value | partition_name +
q4_asia | 'INDIA' 、'PAKISTAN' | q4_2012
q4_europe | 'フランス' 、'イタリア' | q4_2012
SUBPARTITION q4_ SUBPARTITION q4_
q4_americas | 'US '、'CANADA' | q4_2012
q3_americas | 'US '、'CANADA' | q3_2012
q3_asia | 'INDIA' 、'PAKISTAN' | q3_2012
q3_europe | 'フランス' 、'イタリア' | q3_2012
q2_americas | 'US' 、'CANADA' | q2_2012
q2_asia | 'INDIA' 、'PAKISTAN' | q2_2012
q2_europe | 'フランス' 、'イタリア' | q2_2012
q1_americas | 'US' 、'CANADA' | q1_2012
q1_asia | 'INDIA' 、'PAKISTAN' | q1_2012
q1_europe | 'フランス' 、'イタリア' | q1_2012
(12行)
このテーブルに行を追加すると、日付列の値が範囲分割ルールで指定された値と比較されます。 サーバは、行が存在するパーティションを選択する。 国の列の値は、リストのサブパーティショニングルールで指定された値と比較されます。 サーバーが値の一致を見つけると、行は対応するサブパーティションに格納されます。
テーブルに追加された行は、サブパーティションに格納されます。 したがって、すべてのパーティションにはデータが含まれません。
INSERT INTO sales VALUES (10、'9519a' 、'FRANCE' 、'18-Aug-2012 '、'650000');