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

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

最終更新日:May 27, 2024

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_definitionCREATE 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) に情報が格納されます。

(
  dept_no number,   
  part_no varchar2,
  country varchar2(20),
  date date,
  金額番号
)
リストによるパーティー (国)
(
  PARTITION europe VALUES('FRANCE', 'ITALY'),
  PARTITION asia VALUES('INDIA', 'PAKISTAN'),
  PARTITIONアメリカスバリュー (「米国」、「カナダ」)
); 
結果のテーブルは、country列
で指定された値に基づいてパーティション分割されます。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

次の例では、PARTITION BY RANGE句を使用して、salesという名前のパーティションテーブルを作成します。 販売テーブルは、4つのパーティション (q1_2012、q2_2012、q3_2012、およびq4_2012) に情報を格納します。
テーブルの販売を作成する
(
  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 パーティションに格納されます。
サーバーは、パーティショニングルールに基づいて次のステートメントを評価し、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列の値を使用してリスト分割されます。

テーブルの販売を作成する
(
  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')
       )
);
このステートメントを使用して作成されたテーブルには4つのパーティションがあります。 各パーティションには3つのサブパーティションがあります
。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行) 

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

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

サーバーは、パーティショニングとサブパーティショニングのルールに基づいて次のステートメントを評価し、q3_europeパーティションに行を格納します。
INSERT INTO sales VALUES (10、'9519a' 、'FRANCE' 、'18-Aug-2012 '、'650000');