テーブルにプライマリキーを設定して、テーブル内の各レコードの一意性とデータの整合性を確保できます。プライマリキーはデータ管理を容易にします。Hologres のプライマリキーの特性は、従来のデータベースのプライマリキーの特性と同じです。プライマリキーは、テーブル内の各データレコードを一意に識別します。したがって、プライマリキーとして使用される列の値、またはプライマリキーを構成する複数の列の値は一意である必要があり、nullにすることはできません。プライマリキーを構成するために複数の列を指定できます。このトピックでは、Hologres でテーブルのプライマリキーを設定する方法について説明します。
概要
Hologres は、基盤となるレイヤーにプライマリキーインデックスファイルを自動的に保存します。このインデックスファイルは、行指向ストレージモードを使用して、高速なキーバリューサービスを提供します。キーはテーブルのプライマリキーを示し、値は行識別子(RID)とクラスタリングキーを示します。RID は、以前は unique_id と呼ばれていました。RID 値は、UPSERT ステートメントを実行するたびに自動的に生成され、値は単調に増加します。プライマリキーインデックスファイルは、プライマリキーの競合を特定し、データファイルを特定するのに役立ちます。テーブルにプライマリキーを設定すると、プライマリキーインデックスファイル内のプライマリキーに基づいて RID とクラスタリングキーをすばやく特定し、RID とクラスタリングキーに基づいて必要なデータファイルを特定できます。
したがって、プライマリキーを設定した後、Hologres では次の要件を満たすことができます。
高パフォーマンスの UPSERT または DELETE 操作
Hologres では、Append Only モードでデータを書き込むことができ、プライマリキーに基づいて行全体または行内の特定の列にデータを書き込んだり更新したりできます。UPSERT ステートメントを実行してテーブルにデータを挿入すると、Hologres はテーブル全体をスキャンすることなく、プライマリキーに基づいてテーブルを更新します。これにより、高パフォーマンスの UPSERT 操作が実現し、データの一意性が確保されます。
1 秒あたりのクエリ数(QPS)が高いプライマリキーベースのクエリ
テーブルにプライマリキーを設定した後、プライマリキーベースのクエリを実行すると、プライマリキーに基づいてデータの行全体をすばやく特定できます。これにより、クエリのパフォーマンスが向上します。詳細については、「テーブルのストレージモード:行指向ストレージ、列指向ストレージ、行と列のハイブリッドストレージ」をご参照ください。テーブルが行指向ストレージモードを使用している場合、プライマリキーはデフォルトでクラスタリングキーと分散キーとして使用されます。この場合、プライマリキーに基づいて必要なデータファイルを特定できます。これにより、高い QPS とミリ秒レベルの遅延でポイントクエリが実現し、リアルタイムのリスク制御やリアルタイムの推奨などのオンラインアプリケーションシナリオに適用できます。
使用上の注意
情報量の多い列を設定してプライマリキーを構成することをお勧めします。SERIAL データ型の列を設定してプライマリキーを構成することはお勧めしません。SERIAL データ型のデータをテーブルに書き込むと、テーブルレベルのロックが取得されます。これにより、書き込みパフォーマンスが低下します。データが増加するにつれて、SERIAL データの長さが上限を超える可能性があります。
制限事項
プライマリキーとして使用される列の値、またはプライマリキーを構成する複数の列の値は一意である必要があり、null にすることはできません。1 つのステートメントで複数の列を指定して、テーブルのプライマリキーを構成できます。
最大 32 列を指定してプライマリキーを構成できます。
FLOAT、DOUBLE、NUMERIC、ARRAY、JSON、JSONB、DATE、および複合データ型の列は、プライマリキーとして設定できません。Hologres V1.3.22 以降では、DATE データ型の列をプライマリキーとして設定できます。DATE データ型の列をプライマリキーとして設定するには、Hologres インスタンスのバージョンを確認してください。Hologres インスタンスのバージョンが V1.3.22 より前の場合は、Hologres インスタンスをアップグレードしてください。詳細については、「インスタンスの設定」および「インスタンスのアップグレード」をご参照ください。
行指向テーブルまたは行と列のハイブリッドテーブルには、プライマリキーを指定する必要があります。列指向テーブルでは、プライマリキーはオプションです。
プライマリキーは変更できません。テーブルのプライマリキーを変更する場合は、別のテーブルを作成する必要があります。
例
このセクションでは、Hologres V2.1 以降の例を示します。Hologres インスタンスのバージョンが V2.0 以前の場合は、WITH (property = 'value') ステートメントを CALL set_table_property ステートメントに変更してください。詳細については、「概要」をご参照ください。
列指向テーブルを作成し、列をテーブルのプライマリキーとして設定します。
Hologres V2.1 以降でサポートされている構文:
CREATE TABLE tbl_1 ( id bigint NOT NULL, name text NOT NULL, age bigint NOT NULL, class text, reg_timestamp timestamptz NOT NULL, PRIMARY KEY (id) -- id をプライマリキーとして設定 ) WITH ( orientation = 'column', distribution_key = 'id', clustering_key = 'age', event_time_column = 'reg_timestamp', bitmap_columns = 'name,class', dictionary_encoding_columns = 'class:auto' );すべての Hologres バージョンでサポートされている構文:
BEGIN; CREATE TABLE tbl_1 ( id bigint NOT NULL, name text NOT NULL, age bigint, class text, reg_timestamp timesatmptz, PRIMARY KEY (id) -- id をプライマリキーとして設定 ); CALL set_table_property('tbl_1', 'orientation', 'column'); CALL set_table_property('tbl_1', 'distribution_key', 'id'); CALL set_table_property('tbl_1', 'clustering_key', 'age'); CALL set_table_property('tbl_1', 'event_time_column', 'reg_timestamp'); CALL set_table_property('tbl_1', 'bitmap_columns', 'name,class'); CALL set_table_property('tbl_1', 'dictionary_encoding_columns', 'class:auto'); COMMIT;
列指向テーブルを作成し、2 つの列を設定してテーブルのプライマリキーを構成します。
Hologres V2.1 以降でサポートされている構文:
CREATE TABLE tbl_1 ( id bigint NOT NULL, name text NOT NULL, age bigint NOT NULL, class text NOT NULL, reg_timestamp timestamptz NOT NULL, PRIMARY KEY (id,age) -- id と age をプライマリキーとして設定 ) WITH ( orientation = 'column', distribution_key = 'id', clustering_key = 'age', event_time_column = 'reg_timestamp', bitmap_columns = 'name,class', dictionary_encoding_columns = 'class:auto' );すべての Hologres バージョンでサポートされている構文:
BEGIN; CREATE TABLE tbl_2 ( id bigint NOT NULL, name text NOT NULL, age bigint NOT NULL, class text NOT NULL, reg_timestamp timestamptz NOT NULL, PRIMARY KEY (id,age) -- id と age をプライマリキーとして設定 ); CALL set_table_property('tbl_2', 'orientation', 'column'); CALL set_table_property('tbl_2', 'distribution_key', 'id'); CALL set_table_property('tbl_2', 'clustering_key', 'age'); CALL set_table_property('tbl_2', 'event_time_column', 'reg_timestamp'); CALL set_table_property('tbl_2', 'bitmap_columns', 'name,class'); CALL set_table_property('tbl_2', 'dictionary_encoding_columns', 'class:auto'); COMMIT;
行指向テーブルを作成し、テーブルのプライマリキーを設定します。
Hologres V2.1 以降でサポートされている構文:
CREATE TABLE public.tbl_row ( id text NOT NULL, name text NOT NULL, class text, PRIMARY KEY (id) -- id をプライマリキーとして設定 ) WITH ( orientation = 'row', distribution_key = 'id', clustering_key = 'id' );すべての Hologres バージョンでサポートされている構文:
BEGIN; CREATE TABLE public.tbl_row ( id text NOT NULL, name text NOT NULL, class text , PRIMARY KEY (id) -- id をプライマリキーとして設定 ); CALL set_table_property('public.tbl_row', 'orientation', 'row'); CALL set_table_property('public.tbl_row', 'clustering_key', 'id'); CALL set_table_property('public.tbl_row', 'distribution_key', 'id'); COMMIT;
パーティションテーブルを作成し、テーブルのプライマリキーを設定します。
Hologres V2.1 以降でサポートされている構文:
BEGIN; CREATE TABLE public.tbl_parent( a text , b int, c timestamp, d text, ds text, PRIMARY KEY (ds,b) -- ds と b をプライマリキーとして設定 ) PARTITION BY LIST(ds) WITH ( orientation = 'column'); CREATE TABLE public.tbl_child_1 PARTITION OF public.tbl_parent FOR VALUES IN('20221207'); CREATE TABLE public.tbl_child_2 PARTITION OF public.tbl_parent FOR VALUES IN('20221208'); COMMIT;すべての Hologres バージョンでサポートされている構文:
BEGIN; CREATE TABLE public.tbl_parent( a text , b int, c timestamp, d text, ds text, PRIMARY KEY (ds,b) -- ds と b をプライマリキーとして設定 ) PARTITION BY LIST(ds); CALL set_table_property('public.tbl_parent', 'orientation', 'column'); CREATE TABLE public.tbl_child_1 PARTITION OF public.tbl_parent FOR VALUES IN('20221207'); CREATE TABLE public.tbl_child_2 PARTITION OF public.tbl_parent FOR VALUES IN('20221208'); COMMIT;
関連情報
ビジネスクエリシナリオに基づいてテーブルプロパティを設定する方法の詳細については、「シナリオ固有のテーブル作成とチューニングのガイド」をご参照ください。
テーブルを作成し、キーと値のペアをクエリするためのベストプラクティスについては、「キーと値のペアのクエリ」をご参照ください。
Hologres 内部テーブルの DDL ステートメントの詳細については、以下のトピックをご参照ください。