好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 iHangzai 于 2025-3-28 11:01 编辑
关于 Greenplum 数据库
Greenplum 是一款基于 PostgreSQL 的开源大规模并行处理(MPP)数据库,专为处理大规模数据和复杂的分析查询而设计,在数据仓库、商业智能和大数据分析等领域应用广泛。
Greenplum 的元数据存储
Greenplum 使用系统表来存储表结构的元数据,这些元数据记录了表的定义、列信息、索引、约束等内容。
主要的系统表如下:
- pg_class:记录数据库中所有的表、索引、序列等关系对象的基本信息,如表名、表的所有者、表的存储位置等。
- pg_attribute:存储表的列信息,包括列名、数据类型、列的位置等。每一行对应表中的一个列。
- pg_index:记录表的索引信息,如索引名、索引类型、索引所关联的表等。
- pg_constraint:保存表的约束信息,如主键约束、唯一约束、外键约束等。
Greenplum 的数据分布
Greenplum 是一个大规模并行处理(MPP)数据库,表数据会分布在多个节点上存储。表结构也会在各个节点上进行同步,以确保每个节点都知道如何处理和存储表数据。
表数据的分布方式主要有以下几种:
- 随机分布:数据随机地分布到各个节点上,适用于不需要特定数据分布规则的场景。
- 哈希分布:根据指定的列(分布键)的哈希值将数据分布到不同的节点上。这种方式可以保证相同分布键值的数据存储在同一个节点上,有助于提高关联查询的性能。
- 复制分布:表的完整数据会复制到每个节点上。适用于小表,这样可以避免在进行关联查询时的数据移动。
知道了怎么用来存储数据的,那就可以利用数据库本身的系统表,获取存储清单 —— 元数据清单 —— 数据字典!
查询表的分布键信息:
[SQL] 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 | SELECT
att.nspname AS 模式名
, att.relname AS 表名
, table_comment AS 表注释
, string_agg (a.attname, '、' ) AS 分布键
FROM
(
SELECT c.oid
, obj_description(c.oid) AS table_comment
, n.nspname,c.relname,regexp_split_to_table (array_to_string (d.distkey, ' ' ), ' ' ):: int as attnu
FROM gp_distribution_policy d
LEFT JOIN pg_class c ON c.oid = d.localoid
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.oid = 'u_dws.opn_label_factory_user_group' ::regclass
) att
LEFT JOIN pg_attribute a ON a.attrelid = att.oid
WHERE att.attnu = a.attnum
GROUP BY 1,2,3
;
|
或者是:
[SQL] 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | SELECT
aaa.oid,
aaa.nspname AS "模式名" ,
aaa.relname AS "表名" ,
aaa.table_comment AS "中文表名" ,
ccc.attname AS "分布键"
FROM
(
SELECT
aa.oid,
aa.relname,
obj_description ( aa.oid ) AS table_comment,
bb.localoid,
bb.distkey,
regexp_split_to_table( array_to_string( bb.distkey, ' ' ), ' ' ) att,
dd.nspname
FROM
pg_class aa
LEFT JOIN pg_catalog.gp_distribution_policy bb ON bb.localoid = aa.oid
LEFT JOIN pg_namespace dd ON dd.oid = aa.relnamespace
LEFT JOIN pg_inherits hh ON aa.oid = hh.inhrelid
WHERE
dd.nspname = 'u_dws_dev'
AND hh.inhrelid IS NULL
) aaa
LEFT JOIN pg_attribute ccc ON ccc.attrelid = aaa.oid
AND CAST ( ccc.attnum AS TEXT ) = aaa.att
WHERE
ccc.attnum > 0
AND aaa.relname = 'opn_label_factory_user_group'
;
|
查看每个表的注释信息:
[SQL] 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | with tmp_tab as (
select pc.oid as ooid,pn.nspname,pc.*
from pg_class pc
left outer join pg_namespace pn
on pc.relnamespace = pn.oid
where 1=1
and pc.relkind in ( 'r' )
and pn.nspname not in ( 'pg_catalog' , 'information_schema' )
and pn.nspname not like 'pg_toast%'
and pc.oid not in (
select inhrelid
from pg_inherits
)
and pc.relname not like '%peiyb%'
order by pc.relname
),tmp_desc as (
select pd.*
from pg_description pd
where 1=1
and pd.objsubid = 0
)
select t0.*
from (
select tab.relname as table_name,
de.description
from tmp_tab tab
left outer join tmp_desc de
on tab.ooid = de.objoid
where 1=1 and tab.nspname = 'ods_rk'
) t0
where 1=1;
|
字段的注释相关信息:
[SQL] 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | SELECT UPPER (A.SCHEMANAME) AS SCHEMANAME,
UPPER (A.TABLENAME) AS TABLENAME,
UPPER (D.ATTNAME) AS ATTNAME,
REPLACE ( REPLACE ( REPLACE (FORMAT_TYPE(D.ATTTYPID, D.ATTTYPMOD),
'numeric' ,
'NUMBER' ),
'character varying' ,
'VARCHAR2' ),
'date' ,
'DATE' ) AS DATA_TYPE,
E.DESCRIPTION
FROM PG_TABLES A
INNER JOIN PG_CLASS B
ON A.TABLENAME = B.RELNAME
LEFT JOIN PG_CATALOG.PG_DESCRIPTION E
ON B.OID = E.OBJOID
LEFT JOIN PG_CATALOG.PG_ATTRIBUTE D
ON D.ATTRELID = E.OBJOID
AND D.ATTNUM = E.OBJSUBID
WHERE SCHEMANAME = 'pmart_risk'
AND A.TABLENAME LIKE '%表名称%'
AND D.ATTNUM > 0
ORDER BY A.TABLENAME ,D.ATTNUM
;
|
|
|