CREATE PARTITION TABLE ステートメントを実行して、パーティションテーブルを作成できます。このトピックでは、CREATE PARTITION TABLE ステートメントの使用方法について説明します。
説明
特に明記されていない限り、このトピックで言及されている親テーブルは親パーティションテーブルを指し、子テーブルは子パーティションテーブルを指します。
親テーブルは、パーティションキーの値に基づいて異なる子テーブルに分割されます。子テーブルのデータは公開されています。パーティションテーブルを使用する前に、事前に子テーブルを作成する必要があります。CREATE PARTITION TABLE 文を実行して、パーティションテーブルを作成できます。また、テーブルの動的パーティション化を有効にして、子テーブルを自動的に作成することもできます。
パーティションテーブルの子テーブルは、異なるファイルに格納されます。パーティションテーブルのデータをクエリするには、パーティションを指定する必要があります。こうすることで、システムはテーブル内のすべてのパーティションをスキャンする必要がなくなり、目的のファイルをすばやく見つけることができます。これにより、効率が向上します。ほとんどの場合、ファクトテーブルは日付によって異なるパーティションに分割されます。パーティションテーブルの子テーブルは、メタデータストレージ内の非パーティションテーブルと同等です。したがって、パーティションの数が多いと、メタデータの量が増加し、多数の小さなファイルとフラグメントが発生します。
データソースがデータベースの場合は、パーティションテーブルを使用しないことをお勧めします。このシナリオでパーティションテーブルを使用すると、過剰なパーティションによって I/O リソースが浪費される可能性があります。この問題を解決し、インデックスベースのクエリアクセラレーションを実装するには、一般的に使用されるパーティションフィールドを指定してセグメントキーを構成できます。
制限
Hologres では、親テーブルではなく子テーブルにデータをインポートできます。
説明Realtime Compute for Apache Flink では、Hologres の親テーブルにリアルタイムでデータをインポートできます。詳細については、「Hologres のパーティション結果テーブルにリアルタイムでデータを書き込む」をご参照ください。
各パーティション化ルールは、1 つのパーティションテーブルの作成にのみ使用できます。
PARTITION BY句は、リストパーティションのみをサポートしています。パーティションキーは単一列である必要があります。パーティションテーブルにプライマリキーがある場合、パーティションキーはプライマリキーのサブセットである必要があります。
使用上の注意
1 日のデータレコード数が 1 億未満の場合は、日付をパーティション条件として使用せず、日付でパーティションテーブルを作成しないことをお勧めします。そうしないと、各パーティションのサイズが小さくなり、クエリが大幅に高速化されません。より粗い粒度を指定することをお勧めします。
TRUNCATE 操作または DROP 操作を実行してパーティションのデータを頻繁に置き換える必要がある場合は、パーティションテーブルを使用することをお勧めします。このシナリオでパーティションテーブルを使用すると、大量のデータをスキャンすることなく、TRUNCATE 操作または DROP 操作をより効率的に実行できます。
パーティションテーブルを作成する
構文
次の文を使用して、パーティションテーブルを作成できます。
-- 親テーブルを作成します。
CREATE TABLE [IF NOT EXISTS] [<スキーマ名>.]<テーブル名> ([
{
<列名> <列のデータ型> [ <列制約>, [...]]
| <テーブル制約>
[, ...]
}
])
PARTITION BY LIST(<列名>);
-- 子テーブルを作成します。
CREATE TABLE [IF NOT EXISTS] [<スキーマ名>.]<テーブル名> PARTITION OF <親テーブル>
FOR VALUES IN (<文字列リテラル>);パラメーター
次の表は、上記の構文のパラメーターについて説明しています。
パラメーター | 説明 |
if not exists | 同じ名前のテーブルが既に存在する場合、システムはエラーメッセージを返さず、テーブルが既に存在することを通知します。 |
schema_name | テーブルが存在するスキーマの名前。同じスキーマに親テーブルと子テーブルを作成する場合、スキーマ名を指定する必要はありません。スキーマをまたいで親テーブルと子テーブルを作成する場合は、スキーマ名を指定する必要があります。 |
table_name | 作成する親テーブルまたは子テーブルの名前。 |
column_name | 新しいテーブルに作成する列の名前。 |
column_type | 列のデータ型。 |
column_constraints | 列制約の名前。 |
table_constraints | テーブル制約の名前。 |
parent_table | 子テーブルの親テーブルの名前。 |
string_literal | パーティションキー。 |
TEXT、VARCHAR、および INT データ型の列をパーティションキー列として使用できます。Hologres V1.3.22 以降では、DATE データ型の列をパーティションキー列として使用できます。
例
例 1: public スキーマにプライマリキーのない親テーブルとその子テーブルを作成します。
Hologres V2.1 以降でサポートされている構文:
BEGIN; CREATE TABLE public.hologres_parent ( a TEXT, b INT, c TIMESTAMP, d TEXT ) PARTITION BY LIST (a) WITH (orientation = 'column'); CREATE TABLE public.hologres_child1 PARTITION OF public.hologres_parent FOR VALUES IN ('v1'); CREATE TABLE public.hologres_child2 PARTITION OF public.hologres_parent FOR VALUES IN ('v2'); CREATE TABLE public.hologres_child3 PARTITION OF public.hologres_parent FOR VALUES IN ('v3'); COMMIT;すべての Hologres バージョンでサポートされている構文:
BEGIN; CREATE TABLE public.hologres_parent( a TEXT, b INT, c TIMESTAMP, d TEXT ) PARTITION BY LIST(a); CALL set_table_property('public.hologres_parent', 'orientation', 'column'); CREATE TABLE public.hologres_child1 PARTITION OF public.hologres_parent FOR VALUES IN('v1'); CREATE TABLE public.hologres_child2 PARTITION OF public.hologres_parent FOR VALUES IN('v2'); CREATE TABLE public.hologres_child3 PARTITION OF public.hologres_parent FOR VALUES IN('v3'); COMMIT;
例 2: public スキーマにプライマリキーを持つ親テーブルとその子テーブルを作成します。
Hologres V2.1 以降でサポートされている構文:
BEGIN; CREATE TABLE public.hologres_parent_2 ( a TEXT, b INT, c TIMESTAMP, d TEXT, ds TEXT, PRIMARY KEY (ds, b) ) PARTITION BY LIST (ds) WITH (orientation = 'column'); CREATE TABLE public.holo_child_1 PARTITION OF public.hologres_parent_2 FOR VALUES IN ('20201215'); CREATE TABLE public.holo_child_2 PARTITION OF public.hologres_parent_2 FOR VALUES IN ('20201216'); CREATE TABLE public.holo_child_3 PARTITION OF public.hologres_parent_2 FOR VALUES IN ('20201217'); COMMIT;すべての Hologres バージョンでサポートされている構文:
BEGIN; CREATE TABLE public.hologres_parent_2( a TEXT , b INT, c TIMESTAMP, d TEXT, ds TEXT, primary key(ds,b) ) PARTITION BY LIST(ds); CALL set_table_property('public.hologres_parent_2', 'orientation', 'column'); CREATE TABLE public.holo_child_1 PARTITION OF public.hologres_parent_2 FOR VALUES IN('20201215'); CREATE TABLE public.holo_child_2 PARTITION OF public.hologres_parent_2 FOR VALUES IN('20201216'); CREATE TABLE public.holo_child_3 PARTITION OF public.hologres_parent_2 FOR VALUES IN('20201217'); COMMIT;
すべての子テーブルのクエリ
次のいずれかの方法を使用して、親テーブルのすべての子テーブルをクエリできます。
HoloWeb を使用して、親テーブルのすべての子テーブルを視覚的にクエリします。
次の SQL ステートメントを実行して、親テーブルのすべての子テーブルをクエリします。SQL ステートメントでは、ビジネス要件に基づいて parent_table_name を変更します。
SELECT nmsp_parent.nspname AS 親スキーマ, parent.relname AS 親, nmsp_child.nspname AS 子スキーマ, child.relname AS 子 FROM pg_inherits JOIN pg_class parent ON pg_inherits.inhparent = parent.oid JOIN pg_class child ON pg_inherits.inhrelid = child.oid JOIN pg_namespace nmsp_parent ON nmsp_parent.oid = parent.relnamespace JOIN pg_namespace nmsp_child ON nmsp_child.oid = child.relnamespace WHERE parent.relname='parent_table_name';
親テーブルとその子テーブルのプロパティ設定に関するルール
次の表に、子テーブルが親テーブルに接続されている場合に適用されるプロパティ設定のルールを示します。次のルールが適用されます。
親テーブルと一致している必要がある: 子テーブルのプロパティは、親テーブルのプロパティと一致している必要があります。そうでない場合、子テーブルが親テーブルにアタッチされているときにエラーが報告されます。この場合、CREATE TABLE LIKE 文を使用して子テーブルを作成することをお勧めします。
親テーブルと一致する必要はありません:子テーブルのプロパティは、親テーブルのプロパティと異なっていてもかまいません。子テーブルのプロパティが明示的に指定されていない場合、子テーブルは親テーブルの対応するプロパティ設定を継承します。子テーブルのプロパティが明示的に指定されている場合、子テーブルのプロパティ設定は保持されます。
親テーブルのインデックス付き列を含める必要があります:子テーブルのインデックス付き列には、親テーブルのインデックス付き列を含める必要があります。親テーブルのインデックス付き列として指定されていない列は、子テーブルに対して明示的に指定できます。
カテゴリ | テーブルプロパティ | 説明 | CREATE TABLE PARTITION OF ステートメントを実行して作成された子テーブルが、親テーブルからプロパティ設定を継承するかどうか | 子テーブルが親テーブルに接続されている場合に適用されるルール |
テーブルプロパティ | orientation | テーブルのストレージ形式。 | はい | 親テーブルと一致している必要があります。 |
table_group | テーブルが属するテーブルグループ。このプロパティは、テーブルグループのシャード数も指定します。 | はい | 親テーブルと一致している必要があります。 | |
time_to_live_in_seconds | テーブル内のデータの有効期間(TTL)。 | はい | 親テーブルと一致する必要はありません。
| |
インデックス | primary key | テーブルのプライマリキー。 | はい | 親テーブルと一致している必要があります。 |
distribution_key | テーブルの分散キー。 | はい | 親テーブルと一致している必要があります。 | |
clustering_key | テーブルのクラスタリングキー。 | はい | 親テーブルと一致している必要があります。 | |
event_time_column | テーブルのイベント時間列。 | はい | 親テーブルと一致している必要があります。 | |
bitmap_columns | テーブルの辞書エンコード列。 | はい | 親テーブルと一致する必要はありません。 | |
dictionary_encoding_columns | テーブルのフィールドインデックス。 | はい | 親テーブルと一致する必要はありません。 | |
binlog_level | バイナリロギングを有効にするかどうかを指定します。 | はい | 親テーブルと一致している必要があります。 | |
proxima_vectors | テーブルでベクトル検索を実行するために使用されるインデックス。 | はい | 親テーブルと一致している必要があります。 | |
列制約 | nullable | NOT NULL 制約。 | はい | 親テーブルと一致している必要があります。 |
default value | デフォルト値。 | はい | 親テーブルと一致している必要があります。 |
参照
Hologres の動的パーティション化機能は、パーティションテーブルの作成時に構成した動的パーティション化ルールに基づいて、子テーブルを自動的に作成および管理します。パーティションテーブルの作成時にすべてのパーティションを構成する必要はありません。詳細については、「動的パーティション化」をご参照ください。
ALTER PARTITION TABLE文を実行して、パーティションを変更できます。詳細については、「ALTER PARTITION TABLE」をご参照ください。DROP PARTITION TABLE文を実行して、パーティションテーブルを削除できます。詳細については、「CREATE/DROP PARTITION TABLE」をご参照ください。