偶数DB个人笔记
oushuDB 五大特点 :云原生、高性能、强兼容、纯国产、应用广。
oushuDB 基础架构:客户端、主节点、虚拟计算集群、虚拟存储集群。 --5.0 特点---多主节点、虚拟计算集群、虚拟存储集群。
oushuDB 的架构特点及优势:存储及计算分离机构、分布式执行计划引擎、分布式任务调度引擎(QD)、
支持 SIMD 的极速执行引擎、分布式可插拔存储引擎、分布式事务管理、数据库元数据管理、
全局资源管理。
基本组件:master 节点、segment 节点。
oushuDB 是计算和存储分离的,数据存储在 magma/hdfs。
在主节点需配置 magma observer
segment 与 master 区别:无状态、不存储数据库表元数据、不存储本地文件系统中的数据。
启动 oushuDB:集群 hawp start cluster
从节点 hawp start segment
主节点 hawp start master
启动数据存储 start-dfs.sh --hdfs
1、连接 gpadmin
psql -h 127.0.0.1 -p 5432 -U gpadmin -d postgres
h:主机
p: 端口
U: 用户名
d: 数据库名称
2、断开连接
ctrl + D
\q
3、查看数据库
\l
4、切换数据库
\c -d
5、查看当前库的表
\d
模式:
一个数据库包含多个模式(schema),而一个模式可以包含多种命名对象,比如表,数据类型,函数,操作符等。
场景:
允许多个用户同时使用一个数据库,而不产生名字冲突。
把数据库对象组织成多个 schema,好像是多个命名空间一样
第三方应用可以把它们的对象放到一个单独的 schema 中,而不和其他对象产生从图。
注意:schema 不可以嵌套,也就是说,schema 中不可以再包含 schema。
创建模式:
create schema SCHEMA_NAME;
创建或者存取一个 schema 中的对象,可以使用{schema}.{object}形式
eg. :create table myschema.test(i int);
select * from myschema.test;
删除模式:
删除一个空的 schema drop schema myschame;
删除不空的 schema,可以使用 cascade 关键词 drop schema myschema cascade;
使用搜索路径:
使用{schema}.{object}形式,通常用起来不是很方便。可以通过设置 schema 搜索路径来简化。
”SHOW search_path”命令可以给出当前的 schema 搜索路径。
”SET search_path TO schema-name1, schema-name2”可以设置 schema 搜索路径。
表:
OushuDB 表由行(rows)和列(columns)组成。
每一个列有一个列名和一个数据类型,一个表的列数和列的顺序是固定的。
一个表的行数是可变的
创建表:
create table tableName(
columnsName columnType,
...
);
删除表:
drop table tableName;
存储格式:
存储格式:AO,Parquet,ORC,MagmaAP。
AO:是按行存储的格式。
Parquet,ORC,MagmaAP:是按列存储的格式。
MagmaAP 是在 4.0.0.0 发布的全新的存储格式。MagmaAP,ORC 都支持 update/delete,支持事务, 且 MagmaAP 还支持 index。
默认创建的是 AO 表
CREATE TABLE rank1 (id int, rank int, year smallint,gender char(1), count int );
和上面的创建的表一样,显式指定存储格式类型
CREATE TABLE rank2 (id int, rank int, year smallint,gender char(1), count int ) with (appendonly =true, orientation =row);
创建一个 snappy 压缩的 AO 表
CREATE TABLE rank3 (id int, rank int, year smallint,gender char(1), count int ) with (appendonly =true, orientation =row, compresstype = snappy);
创建一个 snappy 压缩的 Parquet 表,如果不指定压缩类型的话,默认不压缩。
CREATE TABLE rank3 (id int, rank int, year smallint,gender char(1), count int ) with (appendonly =true, orientation =parquet, compresstype = snappy);
创建一个不压缩的 ORC 表,如果不指定压缩类型的话,默认不压缩。
CREATE TABLE rank3 (id int, rank int, year smallint,gender char(1), count int ) with (appendonly =true, orientation =orc);
创建一个带压缩的 ORC 表,需指定压缩类型。
CREATE TABLE rank3 (id int, rank int, year smallint,gender char(1), count int ) with (appendonly =true, orientation =orc, compresstype = lz4);
创建一个压缩的 magma 表, magma 内部自动实现了压缩。
CREATE TABLE rank3 (id int, rank int, year smallint,gender char(1), count int ) format 'magmaap';
创建一个有 primary key 的 magma 表, magma 内部自动实现了压缩。
CREATE TABLE rank3 (id int, rank int, year smallint,gender char(1), count int,primary key(id) ) format 'magmaap';
表的分布:
基于 Hash 的分布和 Random 分布
Hash:基于 Hash 的分布方法基于分布列的 Hash 值进行分布
Random:Random 分布采取随机分布模式
创建表时用户不指定分布方式的时候非 magmaap 表默认使用 Random 分布,magmaap 表目前不支持 Random 分布。
CREATE TABLE rank (id int, rank int, year smallint,gender char(1), count int );
CREATE TABLE rank (id int, rank int, year smallint,gender char(1), count int );
DISTRIBUTED RANDOMLY;
下面这个例子创建一个 Hash 分布的表,分布的 Key 使用三个列(rank, gender, year)的组合,数据分布到 32 个 bucket 里面。
如果不指定 bucketnum 的话,系统默认使用 default_hash_table_bucket_number 系统参数的值来做为 bucketnum。
CREATE TABLE rank (id int, rank int, year smallint,gender char(1), count int )
WITH (bucketnum = 32)
DISTRIBUTED BY (rank, gender,year);
优缺点:
非 Magma 表: Random 分布的表较灵活,在系统扩容添加节点后无需重新分布数据。
而 Hash 分布的表在系统扩容后,
为了利用新增加节点的计算能力,
需要重新分布数据。
另外,针对 Hash 分布的表资源管理器在分配资源的时候采取分配固定 virtual segment 数的方式,
不如 Random 分布灵活。
Hash 分布的表在某些查询上会有性能上的好处,因为有时可以避免重新分布某些表。
Hash 分布的表 bucketnum 的选取:
针对 Hash 分布的表,bucketnum 决定了一个查询的并行度。
表分区:
针对大的数据仓库事实表,往往我们可以通过对表进行分区的方式来把一个很大的表拆分成多个子表。
优点:
查询优化器可以针对分区表进行优化,如果查询只设计到某些分区,则查询计划只需要扫描这些分区,从而加速查询
如果我们按照日期进行分区的话,我们可以简单的加入分区和删除过期的分区。
OushuDB 支持基于 Range 和 List 的两种分区方式:
Range 分区:依据数值范围进行分区,比如日期,价格等
List 分区:依据一个值的列表进行分区,比如地区等
Range : # 创建一个 sales 表,按照 date 列 Range 分区,从 2008 年到 2009 年每月创建一个分区
postgres=# CREATE TABLE sales (id int, date date, amt decimal(10,2))
PARTITION BY RANGE (date)
( START (date '2008-01-01') INCLUSIVE
END (date '2009-01-01') EXCLUSIVE
EVERY (INTERVAL '1 month') );
List : List 分区表可以基于任意支持等值比较的数据类型。对与 List 分区,你需要 显式的指定所有子分区。
查看你的分区设计:
pg_partitions 视图来查看你的分区表设计。
添加一个分区:
ALTER TABLE sales ADD PARTITION
START (date '2009-02-01') INCLUSIVE
END (date '2009-03-01') EXCLUSIVE;