【TD迁移系列】TD常用字典视图在GaussDB(DWS)上实现

举报
SeqList 发表于 2020/12/21 21:07:15 2020/12/21
【摘要】 TD有一些常用的字典视图,可能会在迁移TD的过程中脚本使用到,而且客户会更习惯使用TD的字典表,在过渡过程中建一个TD的视图字典表能够让客户更加容易上手GaussDB(DWS)。同时平常需要一些信息的时候,GaussDB(DWS)目前版本的字段提供的信息还不够全面,使用dbc字典能方便使用人员使用。

TD有一些常用的字典视图,可能会在迁移TD的过程中脚本使用到,而且客户会更习惯使用TD的字典表,在过渡过程中建一个TD的视图字典表能够让客户更加容易上手GaussDB(DWS).附件有代码,可以直接拿去部署,但需要建一个dbc schema,同时赋予到public的角色。

TD的字典表除了迁移所需以外,平常需要一些信息的时候,GaussDB(DWS)目前版本的字段提供的信息还不够全面。比如字段信息,很多情况下需要拿到表的schema名称,而all_table_columns等字典视图都没有schema信息。此处新增的dbc.columnsv有一般字段的信息汇总,能方便使用人员。



TD主要的字典视图有:

字典名称 描述 GaussDB(DWS)替换视图
DBC.TABLESV 表、视图、函数等对象信息 pg_tables pg_views
DBC.COLUMNSV 表的字段信息 pg_attribute
DBC.TABLESIZEV 表的空间大小信息 pg_tables
DBC.STATSV 表的统计信息内容 pg_statistic


实现方式:


主要使用现有的DWS字典,查看TD字典所需的内容信息怎么样获取,然后再通过多表关联获取全部信息。类似DBC.TABELESV里面有很多是TD自己的信息,而且那些信息在GaussDB(DWS)无法获取,因此在视图中直接不显示。同时增加了DWS常用的字段,例如oid,分布列,分布方式等。

实现代码示例如下:

drop view dbc.tablesv;
create or replace view dbc.tablesv
as 
select pn.nspname as databasename
,case when pc.relkind = 'f' then 'ft'  when pc.relkind = 'r' then 't' else pc.relkind::varchar(10) end as tablekind  --teradata tablekind when is 'f' means 'function'
--,case when (relkind = 'r' and getdistributekey(pc.oid) is not null) or relkind = 'f' then pg_get_tabledef(pc.oid) when relkind = 'v' then pg_get_viewdef(pc.oid) else '' end as RequestText
,pg_get_userbyid(pc.relowner) as CreatorName
,description as CommentString
,po.ctime as CreateTimestamp
,po.mtime as LastAlterTimeStamp
,case when pc.relkind = 'r' then array_length(string_to_array(getdistributekey(pc.oid),','),1) else 0 end as PIColumnCount
,ppt.partcnt as PartitioningLevels
,pn.oid as SchemaOid
,pc.oid as TableOid
,case when pc.relkind = 'r' then getdistributekey(pc.oid) else null end as DistributeKey
,replace(reloptions[1],'orientation=','') orientation
,replace(reloptions[array_upper(reloptions,1)],'compression=','') as compression
from pg_class pc
inner join pg_namespace pn
on pc.relnamespace = pn.oid
and pc.relkind in ('r','f','v')
and pc.oid > 16384
and pn.oid not in (100)
left join pg_description pd
on pc.oid = pd.objoid
and objsubid = 0
left join pg_object po
on pc.oid = po.object_oid
left join (select parentid,count(*) partcnt from pg_partition where parttype = 'p' group by 1) ppt
on pc.oid = ppt.parentid
;

查询结果如下:


dbc.tablesizev,所有表的大小情况信息

CREATE OR REPLACE VIEW dbc.tablesizev
AS
select databasename
,tablename
,(regexp_split_to_array(tbl_dis,'[\,\(\)]+'))[4]::bigint as vprocname
,(regexp_split_to_array(tbl_dis,'[\,\(\)]+'))[5]::bigint as currentperm
from (
select nspname as databasename
,relname as tablename
,table_distribution(nspname,relname)::text as tbl_dis
from pg_class a
inner join pg_namespace b
on a.relnamespace = b.oid
and a.relkind = 'r'
and b.oid not in (100)
)


/**td的倾斜算法**/
select databasename,tablename,sum(currentperm)/1024/1024 cur_mb,100-(avg(currentperm)/nullif(max(currentperm),0))*100 skewness_factor
from (
select databasename
,tablename
,(regexp_split_to_array(tbl_dis,'[\,\(\)]+'))[4]::bigint as vprocname
,(regexp_split_to_array(tbl_dis,'[\,\(\)]+'))[5]::bigint as currentperm
from (
select nspname as databasename
,relname as tablename
,table_distribution(nspname,relname)::text as tbl_dis
from pg_class a
inner join pg_namespace b
on a.relnamespace = b.oid
and a.relkind = 'r'
and b.oid not in (100)
)
) 
where databasename = 'public' group by 1,2


其他代码此处不一一展示,附件在2021-04-13更新过,修改了dbc.columnsv与dbc.tablesv的一些问题。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。