• Greenplum 常用数据字典


    一、数据库集群信息

    1、gp_segment_configration

    2、pg_filespace_entry

    这两个表是在pg_global表空间下面的,是全局表。

    用来查看集群segment信息,比如segment个数。

    二、常用数据字典表

    1、pg_class 

    保存了所有表、视图、序列、索引元数据信息,每个DDL/DML操作都必须跟这个表发生关系。

    2、pg_attribute

    记录字段的内容

    3、gp_distribution_policy

    记录表的分布键

    4、pg_statistic 和 pg_stats

    数据库中表的统计信息保存在pg_statistic中

    pg_stats可以方便帮我们查看pg_statistic的内容

    5、pg_partition

    记录分区表的信息

    6、pg_partition_rule

    分区表的分区规则

    7、pg_partitions

    三、字典表的应用

    1、查看表的信息

    1)从catalog中查询

    2)从information_schema查询

    select   *  from information_schema.tables where table_name ='';

    1、获取字段信息

    1)从catalog中查询

    SELECT a.attname,pg_catalog.format_type(a.atttypid,( pg_catalog.pg_attribute a, 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;
    2)从information_schema查询
    select * from information_schema.columns where table_name = '';
    2、获取表的分布键

    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;

    3、获取一个视图定义

    testDB=# create table cxfa( a int) distributed by (a);
    CREATE TABLE
    testDB=# create view v_cxfa as select * from cxfa;
    CREATE VIEW
    testDB=# select pg_get_viewdef('v_cxfa', true);
    SELECT cxfa.a FROM cxfa;
    (1 row)

    4、查询备注信息

     1)获取表的备注

    select COALESCE(description, * *) as comment from pg_description where objoid=‘cxfa*::regclass and objsubid=0;

    2)获取字段的备注

     select  b.attname as columnname, COALESCE(a.description,'') as comment 

    from      pg_catalog.pg_description a,pg_catalog.pg_attribute b

    where  objoid='cxfa'::regclass

    and a.objoid=b.attrelid

    and a.objsubid=b.attnum;

    5、获取数据据库建表语句

    1)调用plpythonu

    CREATE PROCEDURAL LANGUAGE plpythonu;

    2)创建存储过程

    create or replace function get_table_structure(tablename text)    # 表名格式为 tableschema.table_name
        returns text
    as $$
        try:
            table_name = tablename.lower().split('.')[1]
            talbe_schema=tablename.lower().split('.')[0]
        except (IndexError):
            return 'Please in put "tableschema.table_name"'
        get_table_oid="select oid,reloptions,relkind from pg_class where oid='%s'::regclass"%(tablename)
        try:
            rv_oid=plpy.execute(get_table_oid,5)      #plpy.execute(query [, max-rows])
            if not rv_oid:
                return 'Did not find any relation named"'+tablename +'".'
        except (Error):
            return 'Did not find any relation named"'+tablename +'".'
        table_oid=rv_oid[0]['oid']
        rv_reloptions=rv_oid[0]['reloptions'] # 访问方法特定的选项,使用"keyword=value"格式的字符串
        rv_relkind=rv_oid[0]['relkind']
        create_sql="";
        table_kind='table';
        if rv_relkind !='r' and rv_relkind !='v':  # r:普通表, v:视图, c:复合类型, t:表, o:内部 AO 节点文件,
            plpy.error('%s is not table or view'%(tablename));
        elif rv_relkind=='v':
            get_view_def="select pg_get_viewdef(%s,'t') as viewdef;" % (table_oid)
            rv_viewdef=plpy.execute(get_view_def);
            create_sql='create view %s as ' % (tablename)
            create_sql += rv_viewdef[0]['viewdef']+' ';
            table_kind='view'
        else:
           #获取行
          get_columns="select a.attname,pg_catalog.format_type(a.atttypid,a.atttypmod),
           (select substring(pg_catalog.pg_get_expr(d.adbin,d.adrelid) for 128)
            from pg_catalog.pg_attrdef d where d.adrelid=a.attrelid and d.adnum=a.attnum and a.atthasdef)
            as default,a.attnotnull as isnull from pg_catalog.pg_attribute
            a where a.attrelid= %s and a.attnum >0 and not a.attisdropped order by a.attnum;" % (table_oid);
            rv_columns=plpy.execute(get_columns)
           
            #获取分布键
            get_table_distribution1="select attrnums from pg_catalog.gp_distribution_policy t where localoid = '" + table_oid + "' "
            rv_distribution1=plpy.execute(get_table_distribution1,500)
            rv_distribution2=''
            if rv_distribution1 and rv_distribution1[0]['attrnums']:
                get_table_distribution2="select attname from pg_attribute where attrelid='"+table_oid+"' and attnum in (" + str(rv_distribution1[0]['attrnums']).strip('{').strip('}').strip('[').strip(']')+")"
                rv_distribution2=plpy.execute(get_table_distribution2,500)
     
            create_sql='create table %s ( ' % (tablename)
            #获取索引
            get_index="select pg_get_indexdef(indexrelid) as indexdef from pg_index where indrelid=%s" % (table_oid);
            rv_index=plpy.execute(get_index);
     
            get_parinfo1="select attname as columnname from pg_attribute where attnum =(select paratts[0] from pg_partition where parrelid=%s) and attrelid=%s;"%(table_oid,table_oid);
            get_parinfo2=""" select pp.parrelid,prl.parchildrelid,case when pp.parkind='h'::"char" then 'hash'::text when pp.parkind='r'::"char" then 'range'::text when pp.parkind='l'::"char" then 'list'::text else null::text end as partitiontype,pg_get_partition_rule_def(prl.oid,true) as partitionboundary from pg_partition pp,pg_partition_rule prl where pp.paristemplate=false and pp.parrelid = %s and prl.paroid = pp.oid order by prl.parname; """ % (table_oid)
            v_par_parent=plpy.execute(get_parinfo1);
            v_par_info=plpy.execute(get_parinfo2);
            max_column_len=10
            max_type_len=4
            max_modifiers_len=4
            max_default_len=4
            for i in rv_columns:
                if i['attname']:
                    if max_column_len < i['attname'].__len__():
                        max_column_len=i['attname'].__len__()
                if i['format_type']:
                    if max_type_len < i['format_type'].__len__():
                        max_type_len=i['format_type'].__len__()
                if i['default']:
                    if max_type_len < i['default'].__len__():
                        max_default_len=i['default'].__len__()
            first=True
            for i in rv_columns:
                if first==True:
                    split_char=' ';
                    first=False
                else:
                    split_char=',';
                if i['attname']:
                    create_sql += " " + split_char + i['attname'].ljust(max_column_len+6)+''
                else:
                    create_sql += "" + split_char + ' '.ljust(max_column_len+6)
                if i['format_type']:
                    create_sql += ' ' + i['format_type'].ljust(max_type_len +2)
                else:
                    create_sql += ' ' + ' '.ljust(max_type_len+2)
                if i['isnull'] and i['isnull']:
                    create_sql += ' ' + ' not null '.ljust(8)
                if i['default']:
                    create_sql += ' default ' + i['default'].ljust(max_default_len+6)
                create_sql += " "
            create_sql += ")"
     
            if rv_reloptions:
                create_sql +=" with ("+str(rv_reloptions).strip('{').strip('}').strip('[').strip(']') +") "
                create_sql = create_sql.replace("'",'')
            if rv_distribution2:
                create_sql += 'Distributed by ('
                for i in rv_distribution2:
                    create_sql += i['attname'] + ','
                create_sql =create_sql.strip(',')+')'
            elif rv_distribution1:
                create_sql += 'Distributed randomly '
            if v_par_parent:
                partitiontype=v_par_info[0]['partitiontype'];
                create_sql +=' PARTITION BY '+ partitiontype + "("+v_par_parent[0]['columnname']+") ( ";
                for i in v_par_info:
                    create_sql +=" " +i['partitionboundary']+', ';
                create_sql=create_sql.strip(', ');
                create_sql+=" )"
            create_sql+="; "
            for i in rv_index:
                create_sql += i['indexdef']+'; '
     
            get_table_comment="select 'comment on %s %s is '''|| COALESCE (description,'')|| '''' as comment from pg_description where objoid=%s and objsubid=0;" % (table_kind,tablename,table_oid)
            get_column_comment="select 'comment on column %s.'||b.attname ||' is ''' || COALESCE(a.description,'')|| ''' ' as comment from pg_catalog.pg_description a,pg_catalog.pg_attribute b where objoid=%s and a.objoid=b.attrelid and a.objsubid=b.attnum;" % (tablename,table_oid)
            rv_table_comment=plpy.execute(get_table_comment);
            rv_column_comment=plpy.execute(get_column_comment);
     
            for i in rv_table_comment:
                create_sql += i['comment']+'; '
            for i in rv_column_comment:
                create_sql +=i['comment']+'; '
            return create_sql;
     
    $$ LANGUAGE plpythonu;
    3)使用例子

    testdb=# SELECT get_table_structure('public.tb1_partition_range_yyyymmdd');
                                                    get_table_structure                                               
    -------------------------------------------------------------------------------------------------------------------
     create table public.tb1_partition_range_yyyymmdd (                                                               
       id               numeric,
       yyyymmdd         date                                                                                          
     ) with (appendonly=true, compresslevel=5)                                                                        
     Distributed by (id)                                                                                              
     PARTITION BY range(yyyymmdd)                                                                                     
     (                                                                                                                
      PARTITION p20120811 START ('2012-08-11'::date) END ('2012-08-12'::date) WITH (appendonly=true, compresslevel=5),
      PARTITION p20120812 START ('2012-08-12'::date) END ('2012-08-13'::date) WITH (appendonly=true, compresslevel=5) 
     );                                                                                                               
                                                                                                                      
     CREATE INDEX idx_yyyymmdd ON tb1_partition_range_yyyymmdd USING btree (yyyymmdd);    
     
    5、查看表的依赖关系
    pg_depend
  • 相关阅读:
    C# 关键字 virtual、override和new的用法
    架构技术及架构要素总结【转】
    vue文件目录结构
    vue项目中,如何对static文件夹下的静态文件添加时间戳,以达到清除缓存
    webpack中关于require与import的区别
    vue 根据下拉框动态切换form的rule
    el-select 根据value查询其对应的label值
    web前端项目规范
    JavaScript 编码规范
    HTML 编码规范
  • 原文地址:https://www.cnblogs.com/xibuhaohao/p/11121012.html
Copyright © 2020-2023  润新知