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);
aligputf8=# 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_