表类型介绍

关键字:

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;

表类型之分区表

  1. 分区指将逻辑上的一个大表拆分成较小的相对独立的子表。
  2. 分区的优点
  3. 减少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);

参考资料

《KingbaseES 产品手册》

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐