Pivotal Knowledge Base

フォローする

スクリプト - テーブルの分散ポリシー情報出力(データベース関数経由)

目的

任意の Greenplum Database における分散ポリシーは、"\d <テーブル名>" コマンドにて簡単に発見可能であるし、gp_distribution_policy テーブルと pg_attribute テーブルの内容をマッチングさせることでも取得可能であるが、catalog テーブルから各テーブルの分散ポリシーを直接取得するための SQL クエリーは存在しない。

本ドキュメントにおいては、テーブルの分散ポリシー情報を取得するめの簡単な SQL 文を生成する一助となる関数を提供する。

注意: 本スクリプトは、運用環境で動作させる前に、テストクラスターで動作確認すること。

解決策

-- "commacat" 関数を生成。

CREATE or replace FUNCTION commacat(acc text, instr text) RETURNS text AS $$
BEGIN
IF acc IS NULL OR acc = '' THEN
RETURN instr;
ELSE
RETURN acc || ',' || instr;
END IF;
END;
$$ LANGUAGE plpgsql
;

-- "textcat_all" 集約関数を生成。

CREATE AGGREGATE textcat_all(
basetype    = text,
sfunc       = commacat,stype       = text,
initcond    = ''
);

-- テーブルの分散ポリシーを取得するために、psql セッションから以下のクエリーを実行。

select nspname||'.'||relname as "Table Name",
  textcat_all(attname) as " Distribution Policy"
from pg_attribute 
join (SELECT pg_class.oid,nspname,relname,unnest(attrnums) as col 
    from gp_distribution_policy  
    join  pg_class  on localoid=oid 
    join pg_namespace nsp on relnamespace=nsp.oid) def on def.col=attnum and oid=attrelid group by 1
union
select nspname||'.'||relname as "Table Name",
       'Random' as " Distribution Policy"
from pg_class c 
join pg_namespace n on n.oid=c.relnamespace
join gp_distribution_policy d on d.localoid=c.oid
and d.attrnums is NULL;

同様の情報を取得するための代替スクリプトについては、こちらを参照のこと。

コメント

Powered by Zendesk