表类型介绍
关键字:
KingbaseES 、表类型、人大金仓
表类型分类
在KES数据库中表类型主要有普通标、临时表、分区表和继承表,具体如下表所示:
表类型 | 关键标识 | |
普通表 | -- | table |
临时表 | 局部临时表 | TEMP |
全局临时表 | GLOBAL TEMP | |
分区表 | 范围分区表 | PARTITION BY RANGE |
列表分区 | PARTITION BY LIST | |
哈希分区 | PARTITION BY HASH | |
继承表 | -- | INHERITS |
表类型之临时表
1.什么是临时表?
●临时表是用来临时性保存数据的表
2.临时表和普通表的不同之处?
●普通表永久存放数据
●临时表临时性存放数据
3.临时表的种类包括:
●局部临时表:该类临时表只属于某个会话,其他会话不能共享该类临时表。
●全局临时表:该类临时表各个会话之间可共享(共享的是表定义),但各个会话只能维护自己创建的数据。
4.每个会话的临时表数据生存周期可分为:
●会话级别:在会话退出后清空表数据
●事务级别:在事务退出后清空表数据
5.创建临时表
(1)创建局部临时表:
CREATE TEMP TABLE my_temp1(id int); BEGIN; INSERT INTO my_temp1 VALUES(1); INSERT INTO my_temp1 VALUES(2); SELECT * FROM my_temp1; COMMIT; SELECT * FROM my_temp1; --\c切换会话后,局部临时表my_temp1被销毁,查询报表不存在 \c SELECT * FROM my_temp1; |
(2)创建全局临时表:
CREATE GLOBAL TEMPORARY TABLE my_temp2(tid int) ON COMMIT DELETE ROWS; BEGIN; INSERT INTO my_temp2 VALUES(1); INSERT INTO my_temp2 VALUES(2); SELECT * FROM my_temp2; COMMIT; --事务提交后查询全局临时表my_temp2,数据被清空 SELECT * FROM my_temp2; |
表类型之继承表
1.表继承
●父表的所有字段被字表所继承
●字表可以有自己的字表,层层继承
●一个子表允许同时从多个父表继承
●使用SQL关键字ONLY,表示SQL操作只作用于父表本身,不涉及继承层次中的任何子表。SELECT、UPDATE、DELETE都支持该关键字,而INSERT不支持。
●子表只会继承检查约束和非空约束,其他约束都不会被继承
2.表继承的例子
CREATE TABLE father(name TEXT PRIMARY KEY,population INT); CREATE TABLE son1(state CHAR(2)) INHERITS (father); CREATE TABLE son2(id INT) INHERITS (father); INSERT INTO father(name) VALUES('father'); INSERT INTO son1(name) VALUES('son1'); INSERT INTO son2(name) VALUES('son2'); SELECT name FROM father; SELECT name FROM son1; SELECT name FROM son2; SELECT name FROM only father; |
表类型之分区表
- 分区指将逻辑上的一个大表拆分成较小的相对独立的子表。
- 分区的优点
- 减少I/O访问量
●查询时通过有选择地搜索分区,降低I/O访问量
●把大表切分后,对大表访问则可转换成对少量字表的访问,从而减少I/O访问量。
(2) 均衡I/O:
●可把不同分区映射到不同磁盘以平衡I/O
(3)利于并行计算:
●通过表分区可实现I/O并行与查询并行
(4)增强可用性
●当表某个分区出现故障时,它的其他分区的数据仍然可用。
●管理员可以以分区为单位进行备份与恢复操作
(5)维护方便
●当表出现故障时,只需要修复故障分区
●使通过较小批处理窗口完成大型数据库对象的维护工作成为可能。
3.支持的分区形式
(1)范围分区:表被根据一个关键列或一组列划分为“范围”,不同的分区的范围之间没有重叠。
(2)列表划分:通过显式地列出每一个分区中出现的键值来划分表。
(3)哈希分区:通过为每个分区指定模数和余数来对表进行分区,每个分区所持有的行都满足:分区键的值除以为其指定的模数将产生为其指定的余数。
(4)组合分区:是二级分区,分区的分区,以上三种形式的组合(一级分区和二级分区分别采用不同的分区方法)。
4.创建范围分区
CREATE TABLE orders(id SERIAL,user_id INT4,create_time TIMESTAMP(0)) PARTITION BY RANGE(create_time); CREATE TABLE orders_history PARTITION OF orders FOR VALUES FROM ('2000-01-01') TO ('2020-03-01'); CREATE TABLE orders_202003 PARTITION OF orders FOR VALUES FROM ('2020-03-01') TO ('2020-04-01'); CREATE TABLE orders_202004 PARTITION OF orders FOR VALUES FROM ('2020-04-01') TO ('2020-05-01'); |
5.创建列表分区:
CREATE TABLE cities(city_id BIGSERIAL NOT NULL,name TEXT NOT NULL,population BIGSERIAL) PARTITION BY LIST(LEFT(LOWER(name),1)); CREATE TABLE cities_a PARTITION OF cities(CONSTRAINT city_id_nonzero CHECK(city_id !=0)) FOR VALUES IN ('a'); CREATE TABLE cities_b PARTITION OF cities(CONSTRAINT city_id_nonzero CHECK(city_id !=0)) FOR VALUES IN ('b'); CREATE TABLE cities_c PARTITION OF cities(CONSTRAINT city_id_nonzero CHECK(city_id !=0)) FOR VALUES IN ('c'); |
6.创建哈希分区:
CREATE TABLE student(stuname TEXT,ctime TIMESTAMP(6) WITHOUT TIME ZONE) PARTITION BY hash(stuname); CREATE TABLE student_p0 PARTITION OF student FOR VALUES WITH(MODULUS 4,REMAINDER 0); CREATE TABLE student_p1 PARTITION OF student FOR VALUES WITH(MODULUS 4,REMAINDER 1); CREATE TABLE student_p2 PARTITION OF student FOR VALUES WITH(MODULUS 4,REMAINDER 2); CREATE TABLE student_p3 PARTITION OF student FOR VALUES WITH(MODULUS 4,REMAINDER 3); |
7.创建组合分区:
CREATE TABLE customer(id INT,status TEXT,arr NUMERIC) PARTITION BY LIST(status); --创建一级列表分区 CREATE TABLE cust_active PARTITION OF customer FOR VALUES IN ('active','reactivated','recurring')PARTITION BY RANGE(arr); --创建二级哈希类型分区 CREATE TABLE cust_arr PARTITION OF cust_active FOR VALUES FROM (MINVALUE) TO (101) PARTITION BY HASH(id); CREATE TABLE cust_arr_part1 PARTITION OF cust_arr FOR VALUES WITH (MODULUS 2,REMAINDER 0); CREATE TABLE cust_arr_part2 PARTITION OF cust_arr FOR VALUES WITH (MODULUS 2,REMAINDER 1); |