gp 导出数据字典_greenplum(postgresql) 数据字典

greenplum是基于postgresql开发的分布式数据库,里面大部分的数据字典是一样的。我们在维护gp的时候对gp的数据字典比较熟悉,特此分享给大家。在这里不会详细介绍每个字典的内容,只会介绍常见的应用以及一些已经封装好了的函数。具体的介绍大家可以去看postgresql的中文文档(附件),里面有详细的解释。

1.postgresql中,所有数据库的对象都是用oid连接在一起的。

这样子会造成我们在理解数据字典的时候有一些不知所云。下面介绍几个函数,可以简化很多的操作。

名字

引用

描述

regproc

pg_proc

函数名字

regprocedure

pg_proc

带参数类型的函数

regoper

pg_operator

操作符名

regoperator

pg_operator

带参数类型的操作符

regclass

pg_class

关系名

最常用的是regclass,关联数据字典的oid,使用方法如下:

aligputf8=# select 1259::regclass;

regclass

----------

pg_class

(1 row)

aligputf8=# select oid,relname from pg_class where oid=‘pg_class‘::regclass;

oid  | relname

------+----------

1259 | pg_class

(1 row)

这样子就可以通过regclass寻找一个表的信息,就不用去关联 pg_class跟pg_namespace(记录schema信息)了。比较方便。

同样的,其他几个类型也是一样的用法,如regproc(regprocedure)是跟pg_proc(保存普通函数的命令)关联的。regoper(regoperator)是跟pg_operator(操作符)的oid关联的。

Eg:

aligputf8=# select oid::regoper,oid::regoperator,oid,oprname from pg_operator limit 1;

oid      |        oid        | oid | oprname

--------------+-------------------+-----+---------

pg_catalog.= | =(integer,bigint) |  15 | =

(1 row)

aligputf8=# select oid::regproc,oid::regprocedure,oid,proname from pg_proc limit 1;

oid   |       oid       | oid  | proname

--------+-----------------+------+---------

boolin | boolin(cstring) | 1242 | boolin

(1 row)

下面给给出如何使用regclass的例子。

2.获取表的字段信息。

表名是放在pg_class,schema名是放在pg_namespace里面的,字段信息是放在pg_attribute里面的。一般是关联这三张表:

eg:

SELECT a.attname,pg_catalog.format_type(a.atttypid, a.atttypmod) AS data_type

FROM    pg_catalog.pg_attribute a,

(

SELECT  c.oid

FROM    pg_catalog.pg_class c

LEFT JOIN pg_catalog.pg_namespace n

ON n.oid = c.relnamespace

WHERE c.relname = ‘pg_class‘

AND n.nspname = ‘pg_catalog‘

)b

WHERE a.attrelid = b.oid

AND a.attnum > 0

AND NOT a.attisdropped ORDER BY a.attnum;

如果使用regclass就会简化很多:

SELECT a.attname,pg_catalog.format_type(a.atttypid, a.atttypmod) AS data_type

FROM    pg_catalog.pg_attribute a

WHERE a.attrelid =‘pg_catalog.pg_class‘::regclass

AND a.attnum > 0

AND NOT a.attisdropped ORDER BY a.attnum;

其实regclass就是一个类型,oid或text到regclass有一个类型转换,跟多表关联不一样,多数据字典表关联的话,如果表不存在,会返回空记录,不会报错,而如果采用regclass则会报错,所以在不确定表是否存在的情况下,慎用regclass。

3.获取表的分布键:

gp_distribution_policy记录这表的数据字典,localoid跟pg_class的oid关联。attrnums是一个数组,记录字段的attnum,跟pg_attribute里面的attnum关联的。

aligputf8=# create table cxfa2 ( a int ,b int ,c int ,d int ) distributed by (c,a);

ligputf8=# select * from gp_distribution_policy where localoid=‘cxfa2‘::regclass     ;

localoid | attrnums

---------+----------

334868 | {3,1}

1 row)

select a.attrnums[i.i],b.attname,a.localoid::regclass

from gp_distribution_policy a,

(select generate_series(1,10))i(i),

pg_attribute b

where a.attrnums[i.i] is not null

and a.localoid=b.attrelid

and a.attrnums[i.i]=b.attnum

and a.localoid=‘public.cxfa2‘::regclass

order by i.i;

结果如下:

attrnums | attname | localoid

----------+---------+----------

3 | c       | cxfa2

1 | a       | cxfa2

(2 rows)

4.获取一个视图的定义。

aligputf8=# \df pg_get_viewdef

List of functions

Schema   |      Name      | Result data type | Argument data types

------------+----------------+------------------+---------------------

pg_catalog | pg_get_viewdef | text             | oid

pg_catalog | pg_get_viewdef | text             | oid, boolean

pg_catalog | pg_get_viewdef | text             | text

pg_catalog | pg_get_viewdef | text             | text, boolean

(4 rows)

使用这个系统函数可以获取视图的定义,可以传入oid或者是表名,第二个参数表示是否格式化输出,默认不格式化输出。

aligputf8=# create tab

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值