OushuDB课程学习笔记
Skylab
确认支持 avx 指令集:cat /proc/cpuinfo | grep avx
关闭防火墙:
systemctl stop iptables
systemctl disable iptables
systemctl stop firewalld
systemctl disable firewalld
启动 OushuDB:
1.source /usr/local/oushu/oushudb/oushudb_path.sh #设置 OushuDB 环境变量
oushudb start cluster #启动整个 OushuDB 集群
2.oushudb start main #启动 master,指的是启动本地 master
oushudb start segment #启动 segment,指的是启动本地 segment
重启或者停止 OushuDB:
方式一:
oushudb restart cluster #重启 OushuDB 集群
oushudb stop cluster #停止 OushuDB 集群
方式二:
oushudb restart main #重启本机的 OushuDB master
oushudb restart segment #重启本机的 OushuDB segment
oushudb stop main #停止本机 OushuDB master
oushudb stop segment #停止本机 OushuDB segment
数据库:
SELECT database FROM pg_database;
\l
CREATE DATABASE name;
createdb dbname
CREATE DATABASE dbname OWNER rolename;
createdb -O rolename dbname
DROP DATABASE name;
dropdb dbname
数据表:
CREATE TABLE my_first_table (
first_column text,
second_column integer
);
DROP TABLE my_first_table;
存储格式:ROW、ORC、Magma
缺省值:
CREATE TABLE products(
product_no integer,
name text,
price numeric DEFAULT 9.99
);
CREATE TABLE purchaseHistory (
purchase_id integer,
product_no integer,
time timestamp DEFAULT now()
);
注意:Magma 格式的表不支持为列设置缺省值。
约束:检查约束、非空约束、主键
检查约束:
CREATE TABLE products(
product_no integer,
name text,
price numeric CHECK(price > 0)
);
CREATE TABLE products(
product_no integer,
name text,
price numeric CONSTRAINT positive_price CHECK(price > 0)
);
CREATE TABLE products(
product_no integer,
name text,
price numeric CHECK(price > 0),
discounted_price numberic CHECK(discounted_price > 0),
CHECK(price > discounted_price)
);
CREATE TABLE products(
product_no integer,
name text,
price numeric,
CHECK(price > 0),
discounted_price numberic,
CHECK(discounted_price > 0),
CHECK(price > discounted_price)
);
CREATE TABLE products(
product_no integer,
name text,
price numeric CHECK(price > 0),
discounted_price numberic,
CHECK(discounted_price > 0 AND price > discounted_price)
);
CREATE TABLE products(
product_no integer,
name text,
price numeric,
CHECK(price > 0),
discounted_price numberic,
CHECK(discounted_price > 0),
CONSTRAINT valid_discount CHECK(price > discounted_price)
);
非空约束:
CREATE TABLE products(
product_no integer NOT NULL,
name text NOT NULL,
price numeric
);
等效于:CHECK(column_name IS NOT NULL),但在 OushuDB 里,创建一个明确的非空约束效率更高。
CREATE TABLE products(
product_no integer NOT NULL,
name text NOT NULL,
price numeric NOT NULL CHECK(price > 0) --顺序并不影响约束检查的顺序
);
主键:只有 Magma 表支持主键约束,而且在创建 MAGMA 表时,可以声明主键列,且主键约束的列里数据类型为非定长时需要将该列放置最后一列。
CREATE TABLE products(
product_no integer,
name text,
price numeric,
PRIMARY KEY (product_no)
) FORMAT ‘MAGMAAP’;
MAGMA 格式的表不支持列约束和非空约束,但支持主键约束。
ALTER TABLE:增加列、删除列、增加约束、删除约束、修改缺省值、修改列数据类型、重命名列、重命名表
ROW:支持所有操作类型;ORC:增加约束、删除约束、重命名表;Magma 完全不支持上述任何操作。
增加列:
ALTER TABLE produces ADD COLUMN description text DEFAULT value;
ROW 格式的表在添加新列时必须设置缺省值。
ALTER TABLE produces ADD COLUMN description text DEFAULT value CHECK(description <> ‘’);
删除列:
ALTER TABLE produces DROP COLUMN description;
增加约束:
ALTER TABLE produces ADD CHECK(name <> ‘’);
ALTER TABLE produces ALTER COLUMN product_no SET NOT NULL;
删除约束:
ALTER TABLE produces DROP CONSTRAINT some_name;
ALTER TABLE produces ALTER COLUMN product_no DROP NOT NULL;
改变列的缺省值:
ALTER TABLE produces ALTER COLUMN price SET DEFAULT 7.77;
--该操作不会影响表中的现存数据,只能改变未来 insert 操作插入的新数据
ALTER TABLE produces ALTER COLUMN price DROP DEFAULT; --移除任何缺省值
改变列的数据类型:
ALTER TABLE produces ALTER COLUMN price TYPE numeric(10,2);
重命名列:
ALTER TABLE produces RENAME COLUMN product_no TO product_number;
重命名表:
ALTER TABLE produces RENAME TO items;
创建分区表:
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’)
);
\d+ sales
多级分区:PARTITION BY 和 SUBPARTITION BY
查看分区表设计:pg_partitions
查看使用子分区模板创建的子分区信息:pg_partition_templates
查看分区表使用的分区键列:pg_partition_columns
表类型 插入 更新 删除
ORC √ √ √
MAGMA √ √ √
ROW √ × ×
OushuDB 暂时不支持分布键和主键的 UPDATE 操作
CREATE TABLE dataTest(
d date,
t time,
tz time with time zone,
ts timestamp,
tsz timestamp with time zone
);
索引:MAGMA 支持索引,ROW、ORC 表均不支持创建使用索引
默认的索引类型是 B-tree 索引,目前最多可以指定 32 个列
CREATE INDEX name_idx ON employee(e_name);
DROP INDEX title_idx;
删除索引后其索引数据会由后台 compact 功能在短时间内清理。
控制事务:
BEGIN TRANSACTION
COMMIT
ROLLBACK
角色和权限:
CREATE ROLE name;
DROP ROLE name;
createuser name
dropuser name
检查现有角色的集合:
SELECT rolename FROM pg_roles;
超级用户 pgadmin
登陆权限:
CREATE ROLE name LOGIN;
CREATE USER name;
超级用户状态:
CREATE ROLE name SUPERUSER;
创建数据库:
CREATE ROLE name CREATEDB;
创建角色:
CREATE ROLE name CREATEROLE;
口令:
CREATE ROLE name PASSWORD ‘string’;
让一个角色能够创建其他角色和新的数据库:
ALTER ROLE name CREATEROLE CREATEDB;
更改一个角色的口令:
ALTER ROLE name WITH PASSWORD ‘newpassword’;
移除一个角色的口令:
ALTER ROLE name WITH PASSWORD NULL;
更改表的权限:
GRANT UPDATE ON department TO fred;
撤销权限:
REVOKE ALL ON accounts FROM PUBLIC;
优化器:
启发式规则优化 RBP
基于代价的优化 CBO
执行器:
向量计算(vectorized execution)
代码生成(code generation)
Snowflake 使用的是向量计算,Impala 使用的是代码生成,Spark 两种都有使用,OushuDB 使用了向量计算外加 SIMD 优化技术。
SIMD(single instruction multi-data),即单指令多数据流,以同步的方式在同一时间内执行同一指令。
Magma 它是存储,它是分布式的,高可用的,支持事务的。作为存储,Magma 存储的数据是表数据,是结构化数据,不是简单的 KV。
它的高可用是通过 Raft 的协议数据复制来实现的。
它的事务特性是通过多版本来实现的。
它的高性能是通过行列混合的存储格式来支持 OLAP 高性能查询。
它提供了数据索引功能,可以建立主键索引和非主键索引。
作为分布式的存储,它整合数据预处理技术,提供了便捷的集群扩展、集群容错以及负载均衡。
四种过程语言:PL/pgSQL、PL/Perl、PL/Python、PL/Java,还有其他过程语言可用,但是它们没有被包括在核心发布中,如 PL/R。