吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 285|回复: 2
收起左侧

[学习记录] 关于 Greenplum 数据库以及常用的一些 SQL.

[复制链接]
iHangzai 发表于 2025-3-28 10:54
本帖最后由 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 -- '模式名.表名'::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' -- 替换成需要的模式schema
    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') -- select pn.oid, pn.* from pg_namespace pn where 1=1
       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 --objsubid 对于一个表列上的一个注释,这里是列号(objoid和classoid指表本身)。对所有其他对象类型,此列为0。
      --and pd.objoid=168605
)
select t0.*
  from (
        select tab.relname as table_name, -- tab.relname:表名
               de.description -- 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' -- and tab.relname='your_table_name' -- tab.nspname:模式名
        ) 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,
       --D.ATTRELID , 
       --D.ATTRELID::regclass,
       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
;


发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

RG文化人 发表于 2025-3-28 12:41

谢谢分享,
llcpojie 发表于 2025-3-28 15:44
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-4-25 22:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表