分散キーの設定と確認方法

分散キーの設定基準:

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');

タグ: Greenplum 分散キー データベース設計 SQL テーブル管理

6月20日 00:39 投稿