记录 OushuDB 学习心得&学习笔记

本月对 OushuDB 整个课程进行了学习,首先感谢官方提供的学习与考试机会,配合文档和学习视频以及老师发布的知识大纲,对偶数数据库有了详细的了解。本文章对一些重要的知识点进行整理,方便自己着重记忆。

1.OushuDB 在 4.0 引入了 magma 引擎,可以替换 hdfs,数据库启动时默认配合底层存储为 hdfs,如果需要使用 magma,需要制定--with_magma 参数,magma 引擎具有很多 hdfs 不具有的优势,值得在生产上大量使用;

2.stats collector 为统计数据收集进程,会生成描述数据库、表等统计信息的。stat 文件,在 GP 下这些信息存储在 pg_stat 目录下,也是有一些相关性的;

3.OushuDB 使用基于代价的 CBO 优化器;现在主流的数据库均采用这种方式,而不使用老旧的基于描述的优化器;

4.偶数 DB 的新执行器:使用了向量化计算 +SIMD 优化技术
执行器是数据库最重要的部件之一,提升执行器的性能可以大大提升查询速度,因此各大厂商都纷纷投入很多精力到执行器的研发中;提升执行器速度主要有两种手段:一种是向量计算 Vectorized Execution,一种是代码生成 Code Generation;目前 snowflake 使用的是向量计算,Impala 使用的是代码生成,Spark 两者都有使用;两种技术侧重点不同都可以提升性能;Oushudb 使用了向量计算 +SIMD 优化技术;向量计算更适合并行处理数据,所以想要在并行计算的基础上进一步提升数据库引擎性能,就可以结合并行处理技术,充分利用 CPU 硬件指令(比如 SIMD)。因为这一特性,所以偶数数据库要求 CPU 必须支持 AVX 指令集。
另外,新执行器全量支持 tpch 和 tpcds,tpch 比 greenplum 大约快 5-10 倍,比 spark SQL 3.0 以上的版本快几十倍。

5.SIMD 可以以同步的方式在同一时间内执行同一条指令,相比单指令单数据流(SISD),可以一次性获得所有操作数,进而加快了运算,充分利用 CPU 性能,特别是数据密集型运算。使用标量运算一次智能执行一对数据的乘法操作,而采用 SIMD 乘法指令,则可以一次同时执行四对数据的乘法操作;作为向量体系结构的一种,SIMD 使用一条向量指令开启一组数据操作,其中数据的加载、存储以及计算以流水线的形式进行。

6.当前 oushudb 还是推荐大家去多食用 orc 和 magma 存储格式;而较少的选用 ao 存储格式;

7.偶数数据库的数据目录存储清晰,以单个节点为例,每个节点有多个数据目录,每个数据目录下又有多个 RG 目录,每个 RG 目录分为 AP 数据目录、索引目录、raft 日志目录,数据目录下根据 Table 进行划分,每个 Table 目录下是 Range 目录,Range 下面是数据文件、统计数据、索引文件、删除数据。

8.Lava 平台可以让用户连接到 oushudb,是白屏化操作界面,商业用户可以采用这种方式管理 oushudb;

9.Magma 是存储
它是分布式的、高可用的、支持事务的分布式存储;因为 HDFS 只支持以追加的方式写入,对表的更新和删除操作很不友好;
作为存储,Magma 存储的是表数据,是结构化数据,不是简单的 kv,magma 支持对表数据进行更新;它的高可用是通过 Raft 的协议数据复制来实现的;
支持基于多版本 MVCC 的分布式事务特性;
目前提供针对分析型负载的高性能数据查询能力,采用行列混合存储的格式;
Magma 提供数据索引功能,可以建立主键索引和非主键索引;

10.有关表 DDL 操作在各种存储类型上的支持,ao 表支持所有操作,magma 表所有表上的 ddl 操作都不支持,orc 表仅支持增加/删除约束和表重命名操作;

11.AO 类型的表增加列时必须设置缺省值;

12.删除非空约束的语句,因为非空约束没有名字,所以不能指定名字删除,可以使用语句:
alter table products alter column products_no drop not null;

13.分区表使用规则
1)数据量通常达到千万记录以上时使用分区表;数据仓库中的事实表可以使用分区表,小于这个数量的通常不需要分区;因为系统管理分区的开销会抵消掉查询优势;
2)只有实施了其他优化手段后,性能仍不可接受时,才考虑分区;
3)分区条件应该尽可能使数据平均划分;
4)分区数不要超过 128 个;太多的分区会减慢管理和维护任务;
5)只有在查询条件能够进行分区裁剪时,性能才会提升,否则全表扫描会更慢;
6)除非必要,少用多级分区。

14.AO 表不支持更新和删除数据,Magma 和 ORC 支持更新和删除数据;

15.偶数数据库暂时不支持分布键和主键的 update 操作;

16.连接
内连接:
内连接 on:select * from a join b on a.id=b.pid;
内连接 using:select * from a join b using(id);
显式内连接操作:select * from a join b on a.id=b.id;
隐式内连接操作:select * from a,b where a.id=b.id;
交叉链接:cross join 返回笛卡尔积
select * from a cross join b;
natural join:自动形成一个由两个表同名列组成的连接组合;如果没有同名列,natural join 的结果等同于 cross join;

  1. TRUE FALSE UNKNOW
    SELECT x AND x,当 and 符号两边存在假的时候,则一定为假;select null and null, null and true; 则为 null。
    OR 操作中,只要存在 TRUE 则都为真;只有两遍的结果均为 FALSE,那么结果一定为假;select null or false, null or null;则都为 null。
    逻辑非的情况下,not true 为 false,not false 为 true,not null 为 null;

18.除法、方根、开方
select 10/3, 3^2, |/16;

19.索引可以加快 select 操作,但是会减缓 update 和 insert 操作,偶数 DB 目前只有 Magma 表支持索引,AO 和 ORC 均不支持索引;B-tree 索引目前最多可以指定 32 个列。

20.视图是只读的,不允许进行插入修改和删除;

21.如果是 MAGMA 格式的表,是不支持列约束和非空约束的,但支持主键约束。

22.使用分区表时,分区数不要超过 128 个,太多的分区将会减慢管理和维护任务。

23.用户和角色都是角色,只是用户是具有登录权限的角色。例如:
create user db_user1 password '123';
create role db_user1 password '123' LOGIN; --同上一句等价

24.只有在客户认证方法要求与数据库建立连接必须使用口令的时候,口令才比较重要。口令拥有 password, md5 和 crypt 等不同的认证方法。

25.对象所有者总是隐含地拥有 DROP, GRANT, REVOKE 等特殊权限,并且不能赋予或者撤销。 但是对象所有者可以选择撤销自己的普通权限,比如把一个表做成对自己和别人都是只读的。

26.以口令为基础的认证方法包括 md5,crypt 和 password。这些方法操作上非常类似, 只不过口令通过连接 传送的方法不同:分别是 MD5 哈希、crypt 加密、明文。有一个限制是 crypt 方法不适用于 pg_authid 已 经加密的口令。

以上为个人在整个学习过程中的一些知识收获,本次学习偏重于理论学习,实践操作比较少,希望后期可以获取更多实践方面的培训和指导,让我对偶数数据库了解的更深入 ~

评论
    test