greenplum(postgresql)之数据字典

本文介绍了Greenplum,一个基于PostgreSQL的分布式数据库,分享了其数据字典的常见应用和相关函数,包括:1)通过oid理解和操作数据字典;2)获取表字段、分布键、视图定义、权限信息、评论、依赖关系和类型转换等。通过这些内容,帮助读者更好地理解和维护Greenplum数据库。
摘要由CSDN通过智能技术生成

 

     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_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值