分散キーの設定基準:
Greenplumではデータを均等に分散させるために分散キーを使用します。したがって、適切な分散キーを選択することが非常に重要です。 基準:
(1)データの分布が均等でNULL値が少ないカラムを分散キーとして選択することが望ましい(主キーは分散キーに最適)。もし主キーが分散キーでない場合、システムは自動的に主キーを分散キーに変更します。
(2)クエリ実行計画に基づき、テーブル間の結合時にデータの再分散やブロードキャストが発生する可能性があるため、他のテーブルとの共通結合キーも考慮すべきです。また、GROUP BYやウィンドウ関数もデータの再分散を引き起こすことがあります。
(3)結合キーと一意制約キーが異なる場合は、バランスを取る必要があります。
(4)テーブルに主キーまたは一意制約が定義されている場合、そのキーの列は分散キーの先頭に配置されなければなりません。
(5)distributed句が指定されていない場合、最初の列がデフォルトでハッシュキーとして使用されます。
(6)もう一つの分散方式はラウンドロビン方式です:
データはランダムにセグメントに割り当てられ、同じレコードが複数のセグメントに保存されることがあります。ラウンドロビンはデータの均等分散を保証しますが、Greenplumではノード間の一意性制約が存在しないため、データの一意性は保証できません。一意性とパフォーマンスの観点から、ハッシュ分散を推奨します。構文はDISTRIBUTED RANDOMLYです。
(7)一意性:ハッシュ分散キーはデータの一意性を保証しますが、ランダム分散キーは保証しません(複数のインスタンスが存在するため)。
分散キーの変更:
(1)分散キーの確認
select n.nspname AS "スキーマ名",c.relname AS "テーブル名",case when p.policytype='p' then 'パーティションテーブル' when p.policytype='r' then '複製分散' end "分散方式", pg_get_table_distributedby(c.oid) "分散キー" ,c.reloptions "圧縮形式"
from pg_class c
left join gp_distribution_policy p on c.oid=p.localoid
left join pg_namespace n on c.relnamespace=n.oid
where c.relname in ('テーブル名');
(2)テーブル内のデータ分布状況の確認
select gp_segment_id,count(*) from "テーブル名" group by 1 ;
(3)分散キーの選定
分散キーの選択基準に従って適切なキーを設定します。
(4)テーブルの分散キーの変更とデータの再分散
ALTER TABLE "テーブル名" SET WITH (REORGANIZE=TRUE) DISTRIBUTED BY (分散キー名);
ランダム分散への変更:
ALTER TABLE "テーブル名" SET WITH (REORGANIZE=TRUE) DISTRIBUTED randomly;
シーケンスの作成:
CREATE TABLE users
(
id SERIAL primary key ,
name character varying,
password character varying
);
または列の追加:
分散キーの変更:
ALTER TABLE "テーブル名" SET WITH (REORGANIZE=TRUE) DISTRIBUTED BY (分散キー名);
ALTER TABLE "public"."test"
ADD COLUMN "id1" bigserial,
ADD PRIMARY KEY ("id1");
シーケンスの作成:
CREATE SEQUENCE users_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
主キーの自動インクリメント設定:
alter table users alter column id set default nextval('users_id_seq');