[视频]云原生数据仓库 AnalyticDB PostgreSQL 版解析与实践(上)|学习笔记(二)

本文涉及的产品
PolarDB Agent Express,2核4GB
云数据库 PolarDB MySQL 版,列存表分析加速 4核8GB
简介: 快速学习[视频]云原生数据仓库 AnalyticDB PostgreSQL 版解析与实践(上)

开发者学堂课程【数据仓库 ACP 认证课程[视频]云原生数据仓库 AnalyticDB PostgreSQL 版解析与实践(上) 】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/928/detail/14626


[视频]云原生数据仓库 AnalyticDB PostgreSQL 版解析与实践(上)

 

三、产品相关概念

1.数据库实例及操作

(1)创建实例-规格选择

image.png

Segment

数量越多,单条查询性能越好;CPU核数越多,并发能力越好

计算节点/计算组

CPU内存资源被该节点/组内所有Segment共享

(2)建表:ADB PG逻辑架构

ADB PG实例

云平台上的一个MPP数据库集群,创建时分配固定资源,包含一组数据库、模式、表对象和数据以及用户

数据库( Database )

一个ADB PG实例中,包含多个逻辑Database,其中可包含模式等对象

模式(Schema )

逻辑概念,数据库中的逻辑空间,包含一系列表,视图等对象

表(Table )

数据分布定义∶按分布键Hash值,随机Random,或复制Replication三种方式,进行节点间数据分布

Hash分布不一定是均匀的,随机分布是均匀的

存储格式定义︰支持指定按行存储,或者按列存储

压缩算法定义(可选)︰支持多种高性能数据压缩算法

分区表支持(可选)∶对于大表,支持按区间Range ,或值LIST进行分区,且支持多级分区

image.png

(3)建表>表分布方式:在MPP节点间的三种分布方式

image.png

Hash分布是有规律的,随机分布没有规律,但是均匀的。

image.png

(4)建表并导入数据-分布与分区分区越多,存储的文件越多

定义分区是根据业务查询需要定义,一定是有分布的

(5)建表>分布键:表的分布键选择原则

①选择数据分布均匀的列

若选择的分布列数值分布不均匀,则可能导致数据倾斜。某些Segment分区节点存储数据多(查询负载高)。

根据木桶原理,时间消耗会卡在数据多的节点上.故不应选择bool类型,时间日期类型数据作为分布

②选择经常需要JOIN的列作为分布键

当JOIN键和分布键一致时,可以在 Segment分区节点

内部完成JOIN.

否则需要将一个表进行重分布来实现重分布关联或者广播其中小表来实现广播关联,后两种方式都会有较大的网络开销。

③选择高频率查询条件列作为分布键

从而可能实现按分布键做节点segment的裁剪

④默认表的主键为分布键

若表没有主键,则默认将第一列当做分布键

⑤其他原则

谨慎选择随机分布DISTRIBUTEDRANDOMLY,这将使得上本地关联,或者节点裁剪不可能实现

小表可选择复制表模式,在所有Segment上均保存一份全量数据

(6)建表>分布键:

create table tl(c1 int, c2 int) distributed by (c1);

通过下述语句查看表数据的倾斜情况︰

select gp_segment_id, count1) from tl group by 1 order by 2 desc;

gp_segment_id | count

---------+--------

2 | 131191

0 |     72

1 |     68

( 3 rows )

如果发现某些Segment上存储的数据明显多于其他Segment,该表存在数据倾斜。建议选取数据分布平均的列作为分布列

alter table tl set distributed by (c2 ) ;

(7)建表>压缩:多种压缩算法,成本和性能取得平衡

数据压缩可用于列存表或者行存追加表,平均3倍以上数据压缩率

推荐使用 ZSTD 与 LZ4

算法名

特点

压缩级别

版本支持

ZLIB

标准、通用

1-9

4.3,6.0

ZSTD

解压性能高

1-19

6.0

LZ4

压缩/解压缩快

1-19

6.0

RLE

主要针对数值类型

 

4.3,6.0

 CREATE TABLE foo (a int, b text)

WITH (appendonly=true, orientation=column, compresstype=zstd, compresslevel=9)DISTRIBUTED BY (a);

(8)统计信息

优化建议∶

统计信息收集方式可基于全库、表、列级别,可根据实际情况确定收集范围

导入数据后、超过20%数据更新(IUD)后、创建索引后,需进行统计信息收集

用户ETL任务过程中,会涉及多次IUD,可根据客户业务情况,在其中适当添加analyze语句

调优过程中,从执行计划中看到表行数估算为1行,计划中出现较多的Broadcast、Sort+GroupByAgg、NestLoop等算子时,考虑对相应数据表进行analyze

收集范围

语句示例

全库

analyse ;

analyse t1;

analyse t1(c1);

导入数据

create table t1 (a int, b int);

insert into t1 select vv from generate_series(1,1000) as v;analyze t1; --第一次加载大量数据后,重新收集统计信息

ETL 过程

truncate t1;

insert into t1 select * from t2;

insert into t1 select * from t3;

analyze t1; --重建数据后,重新收集统计信息

select a,b,c from t1 join t2 on t1.c=t2.d where t2.b = 2;

(9)建表并导入数据-建表示例

image.png

(10)建表并导入数据

image.png

DBStack 形态还支持 gpfdist 外表导入

COPY性能在30-50找Mb/s, OSS导入性能取决于带宽与节点个数,并行导入的方式

(11)执行SQL 查询

image.png

2.权限管理

(1)权限管理∶逻辑结构及其权限关系

①实例权限:

白名单配置

②数据库权限:

grant赋予是否允许连接或创造schema的权限

Revoke回收

③schema权限:

grant赋予允许查询schema中的对象

revoke回收

④object权限:

grant赋予

revoke回收

实例权限主要控制实例连接鉴权

数据库级别权限包括:

是否允许连接数据库

是否允许在数据库中创建schema

默认允许public角色性出的任

默认不允许除了超级用户和owner之外的任何人在数据库中创建schema

默认会自动创建名为public的schema,且允许任何人在里面创建对象

schema级别权限包括:

是否允许查看schema中的对象

是否允许在schema中创建对象

默认情况下新建的schema的权限不会赋予给public角色,因此除了超级用户和owner ,任何人都没有权限查看schema中的对象或者在schema中新建对象

(2)权限管理∶授予和撤销权限

①授予权限

关键字GRANT

GRANT权限ON对象类型对象名TO用户名.如:

GRANT SELECT ON TABLE table TO user1; --允许user1 select table.

直接对表的 SELECT 权限赋予 user

GRANT SELECT ON TABLE table TO public; --允许所有人select table撤销权限

②关键字REVOKE

REVOKE权限ON对象类型对象名FROM用户名.如:

REVOKE SELECT ON TABLE table FROM user1; --不再允许user1 select table

(3)权限管理:查询权限

SELECT n.nspname as "Schema",

c.reIname as "Name",

CASE c.relkind

WHEN 'r'THEN 'table'

WHEN 'v' THEN 'view'

WHEN 'm’THEN 'materialized view'

WHEN 'S" THEN 'sequence'

WHEN 'f THEN 'foreign table'

END as "Type",

pg_catalog.array_to_string(c.relacl,E\n')AS "Access privileges"

FROM pg_catalog.pg_class c

LEFT JOIN pg_catalog.pg_namespace n ON n.oid =c.relnamespace

WHERE c.relkind IN ('r, 'v' , 'm', 'S', 'f)

ANDn.nspname !~"^pg_'AND

pg_catalog.pg_table_is_visible(c.oid)

ORDER BY 1,2;

image.pngAccess privileges:

其格式为rolename=xox/yyyy,表明yyyy 用户将xoox权限赋予给了rolename.若rolename为空,则表明public. xoox中每一个字符表明一个特定权限:

r -- SELECT ("read")

w -- UPDATE ("write")

a -- INSERT ("append")

d -- DELETE

D -- TRUNCATE

x -- REFERENCES

t -- TRIGGER

X -- EXECUTE

U -- USAGE

C -- CREATE

c -- CONNEC

T -- TEMPORARY

arwdDxt -- ALl PRIVILEGES(for tables, varies for other objects)

* -- grant option for preceding privilege

2. UDF 和存储过程

在AnalyticDB PostgreSQL中,创建UDF和存储过程都是采用CREATE FUNCTION语法。

不同于ORACLE、MYSQL等数据库,PostgreSQL中并没有专门用于创建存储过程的CREATE PROCEDURE语法。

以SQL过程语言PL/pgSQL用法最为广泛,最为贴近内核。

将多个数据加工成函数

PL/pgSQL

①用于创建函数和触发器过程

②为 SQL 语言增加控制结构

③执行复杂的计算

④继承所有用户定义类型、函数、操作符

⑤定义为被服务器信任的语言

⑥容易使用

image.png

(1)UDF和存储过程:PL/pgsQL基本结构介绍

AnalyticDB PostgresQL 函数通常结构如下:

Begin and 是一种语法格式

image.png(2)UDF和存储过程∶块结构介绍

PL/pgSQL是一个块结构语言,函数体由块结构组成,定义如下︰

BLOCK

[ <> ]

[ DECLARE

declarations ]

BEGIN

statementsEND [ label ];

注意事项

块中的每个声明和每条语句都是用一个分号终止。

块结构支持嵌套使用。子块用于逻辑分组,在子块中声明的变量在其范围之内,将屏蔽跟这个子块外部有着同样的名字的变量。

BEGIN之后不要分号。

END之后要分号。最外层的可缺省。

END后的标签要和块开始的标签保持一致。

所有关键字不区分大小写,默认转换成小写,除非被双引号引用。

注释的方法和普通SQL一样。

PL/pgSQL里用于语句块分组的BEGIN/END不是开始或者结束事务。

(3)UDF和存储过程∶块结构-示例

CREATE OR REPLACE FUNCTION somefunc( RETURNS integer As $$

<< outerblock >>

DECLARE

quantity integer := 30;

BEGIN

RAISE NOTICE "Quantity here is %" , quantity,-- Prints 30

quantity := 50,

--

-- Create a subblock

DECLARE

quantity integer := 80;

BEGIN

RAISE NOTICE "Quantity here is %" , quantity,-- Prints 80

RAISE NOTICE "Outer quantity here is %" ,outerblock.quantity,-- Prints 50

END;

RAISE NOTICE "Quantity here is %" , quantity, -- Prints 50

RETURN quantity,

END;

$$ LANGUAGE plpgsql;

image.png

相关实践学习
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
存储 Prometheus 监控
Prometheus 基本高可用架构
Prometheus 基本高可用架构
|
弹性计算
ECS最多可以挂多少块数据盘?
ECS最多可以挂多少块数据盘?
236 2
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
308 4
|
Java 数据库连接 Spring
一篇文章带你了解Spring声明式事务的底层实现原理。
1. Mybatis是如何整合进Spring中的 - Spring如何知道哪些接口是Mapper接口的? - Mapper接口是如何变成Spring Bean的? 2. Spring在哪里声明的SqlSession的实现逻辑? 3. Spring中声明式事务的实现方式是怎样的? 4. Spring中如何处理嵌套事务的? 5. Spring中事务的传播方式是如何实现的?
1268 0
一篇文章带你了解Spring声明式事务的底层实现原理。
|
存储 JavaScript
vue实现本地存储
什么是本地存储 通过本地存储(Local Storage),web 应用程序能够在用户浏览器中对数据进行本地的存储。 localStorage(永久存储) 永久的存储在本地,除非手动销毁
|
存储 监控 数据安全/隐私保护
ZooKeeper 数据模型:节点的特性与应用
zk的基础知识基本分为三大模块 • 数据模型 • ACL 权限控制 • Watch 监控
353 0

热门文章

最新文章