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

PolarDB:テーブルを作成... PARTITION BY

最終更新日:Jan 06, 2025

CREATE TABLEステートメントのPARTITION BY句を使用して、パーティションテーブルを作成できます。 このパーティションテーブルのデータは、1つ以上のパーティション (およびサブパーティション) に分散されます。

構文

CREATE TABLEステートメントには、次の3つの形式があります。

  • リストパーティション分割構文

    最初の形式は、リストパーティションテーブルを作成することです。

    CREATE TABLE [ schema. ]table_name
     table_definition
       PARTITION BY LIST(column)
       [SUBPARTITION BY {RANGE|LIST|HASH} (column[, column ]...)]
       (list_partition_definition[, list_partition_definition]...);

    list_partition_definitionは次のとおりです。

    PARTITION [partition_name]
      VALUES (value[, value]...)
      [TABLESPACE tablespace_name]
      [(subpartition, ...)]
  • 範囲パーティション分割構文

    2番目の形式は、範囲分割テーブルを作成することです。

    CREATE TABLE [ schema. ]table_name
     table_definition
       PARTITION BY RANGE(column[, column ]...)
       [SUBPARTITION BY {RANGE|LIST|HASH} (column[, column ]...)]
       (range_partition_definition[, range_partition_definition]...);

    range_partition_definitionは:

    PARTITION [partition_name]
      VALUES LESS THAN (value[, value]...)
      [TABLESPACE tablespace_name]
      [(subpartition, ...)]
  • サブパーティション分割構文

    サブパーティションは、次の2つのタイプのいずれかです。

    {list_subpartition | range_subpartition}

    list_subpartitionは次のとおりです。

    SUBPARTITION [subpartition_name]
      VALUES (value[, value]...)
      [TABLESPACE tablespace_name]

    range_subpartitionは次のとおりです。

    SUBPARTITION [subpartition_name]
      VALUES LESS THAN (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]...)

valueを使用して、テーブルエントリをパーティションにグループ化する引用符で囲まれたリテラル値 (またはコンマで区切られたリテラル値のリスト) を指定します。 各パーティショニングルールは少なくとも1つの値を指定する必要がありますが、ルールで指定される値の数に制限はありません。 valueは、nulldefault (LISTパーティションを指定する場合) 、またはmaxvalue (RANGEパーティションを指定する場合) です。

リストパーティションテーブルのルールを指定する場合は、最後のパーティションルールにDEFAULTキーワードを含めて、一致しない行を指定したパーティションに移動します。 DEFAULTの値を含めない場合、少なくとも1つのパーティションの指定されたルールと一致しない行を追加しようとするINSERTステートメントは失敗し、エラーを返します。

レンジパーティションテーブルのルールを指定する場合は、最後のパーティションルールにMAXVALUEキーワードを含めて、カテゴリ化されていない行を指定されたパーティションに移動します。 MAXVALUEパーティションを含めない場合、パーティションキーが指定された最大値より大きい行を追加しようとするINSERTステートメントは失敗し、エラーを返します。

tablespace_name

パーティションまたはサブパーティションが存在するテーブルスペースの名前。

例 - PARTITION BY LIST

次の例では、PARTITION BY LIST句を使用して、salesという名前のパーティションテーブルを作成します。 salesテーブルは、3つのパーティション (europe、asia、americas) に情報を格納します。

CREATE TABLE sales
(
  dept_no     number,   
  part_no     varchar2,
  country     varchar2(20),
  date        date,
  amount      number
)
PARTITION BY LIST(country)
(
  PARTITION europe VALUES('FRANCE', 'ITALY'),
  PARTITION asia VALUES('INDIA', 'PAKISTAN'),
  PARTITION americas VALUES('US', 'CANADA')
);

結果のテーブルは、country列で指定された値に基づいてパーティション分割されます。

acctg=# SELECT partition_name, high_value from ALL_TAB_PARTITIONS;
 partition_name |     high_value      
----------------+---------------------
 americas       | 'US', 'CANADA'      
 asia           | 'INDIA', 'PAKISTAN' 
 europe         | 'FRANCE', 'ITALY'   
(3 rows)
  • country 列の値が US または CANADA の行は、americas のパーティションに格納されます。

  • country 列の値が INDIA または PAKISTAN の行は、asia のパーティションに格納されます。

  • country 列の値が FRANCE または ITALY の行は、europe のパーティションに格納されます。

サーバーは、パーティション分割ルールに基づいて次のステートメントを評価し、その行をeuropeパーティションに格納します。

INSERT INTO sales VALUES (10, '9519a', 'FRANCE', '18-Aug-2012', '650000');

例 - PARTITION BY RANGE

次の例では、PARTITION BY RANGE句を使用して、salesという名前のパーティションテーブルを作成します。 販売テーブルは、4つのパーティション (q1_2012、q2_2012、q3_2012、およびq4_2012) に情報を格納します。

CREATE TABLE sales
(
  dept_no     number,
  part_no     varchar2,
  country     varchar2(20),
  date        date,
  amount      number
)
PARTITION BY RANGE(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')
);

結果のテーブルは、日付列で指定された値に基づいてパーティション分割されます。

SELECT partition_name, high_value from ALL_TAB_PARTITIONS;
 partition_name |                            high_value                            
----------------+------------------------------------------------------------------
 q1_2012        | FOR VALUES FROM (MINVALUE) TO ('01-APR-12 00:00:00')
 q2_2012        | FOR VALUES FROM ('01-APR-12 00:00:00') TO ('01-JUL-12 00:00:00')
 q3_2012        | FOR VALUES FROM ('01-JUL-12 00:00:00') TO ('01-OCT-12 00:00:00')
 q4_2012        | FOR VALUES FROM ('01-OCT-12 00:00:00') TO ('01-JAN-13 00:00:00')
(4 rows)
  • 2012 年 4 月 1 日より前の日付列の値を持つ行は、q1_2012 パーティションに格納されます。

  • 2012 年 7 月 1 日より前の日付列の値を持つ行は、q2_2012 パーティションに格納されます。

  • 2012 年 10 月 1 日より前の日付列の値を持つ行は、q3_2012 パーティションに格納されます。

  • 2013 年 1 月 1 日より前の日付列の値を持つ行は、q4_2012 パーティションに格納されます。

サーバーは、パーティショニングルールに基づいて次のステートメントを評価し、q3_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列の値を使用してリスト分割されます。

CREATE TABLE sales
(
  dept_no     number,
  part_no     varchar2,
  country     varchar2(20),
  date        date,
  amount      number
)
PARTITION BY RANGE(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')
       )
);

このステートメントを使用して作成されたテーブルには4つのパーティションがあります。 各パーティションには3つのサブパーティションがあります。

SELECT subpartition_name, high_value, partition_name FROM ALL_TAB_SUBPARTITIONS;
 subpartition_name |             high_value              | partition_name 
-------------------+-------------------------------------+----------------
 q1_americas       | FOR VALUES IN ('US', 'CANADA')      | q1_2012
 q1_asia           | FOR VALUES IN ('INDIA', 'PAKISTAN') | q1_2012
 q1_europe         | FOR VALUES IN ('FRANCE', 'ITALY')   | q1_2012
 q2_americas       | FOR VALUES IN ('US', 'CANADA')      | q2_2012
 q2_asia           | FOR VALUES IN ('INDIA', 'PAKISTAN') | q2_2012
 q2_europe         | FOR VALUES IN ('FRANCE', 'ITALY')   | q2_2012
 q3_americas       | FOR VALUES IN ('US', 'CANADA')      | q3_2012
 q3_asia           | FOR VALUES IN ('INDIA', 'PAKISTAN') | q3_2012
 q3_europe         | FOR VALUES IN ('FRANCE', 'ITALY')   | q3_2012
 q4_americas       | FOR VALUES IN ('US', 'CANADA')      | q4_2012
 q4_asia           | FOR VALUES IN ('INDIA', 'PAKISTAN') | q4_2012
 q4_europe         | FOR VALUES IN ('FRANCE', 'ITALY')   | q4_2012
(12 rows)

このテーブルに行を追加すると、日付列の値が範囲分割ルールで指定された値と比較されます。 サーバは、行が存在するパーティションを選択する。 国の列の値は、リストのサブパーティショニングルールで指定された値と比較されます。 サーバーが値の一致を見つけると、行は対応するサブパーティションに格納されます。

テーブルに追加された行は、サブパーティションに格納されます。 したがって、すべてのパーティションにはデータが含まれません。

サーバーは、パーティショニングとサブパーティショニングのルールに基づいて次のステートメントを評価し、その行をq3_europeパーティションに格納します。

INSERT INTO sales VALUES (10, '9519a', 'FRANCE', '18-Aug-2012', '650000');