当前位置: 首页 > news >正文

postgresql(功能最强大的开源数据库)继承特性和分区实现

    PostgreSQL实现了表继承,在多重表继承下,对上亿条不同类别的数据条目进行按型号、按月份双层分区管理,既可在总表查阅所有条目的共有字段,也可在各类型字表查询附加字段,非常高效。

    分区是通过继承的方式来实现的,每个分区实际上都是一个独立的表。

1,继承

    我们创建两个表来说明继承的特性:创建一个人类表和leader表,全球很多人,但是只有少数人是国家leader人。我们希望能够快速地检索任何国家的leader,继承特性有助于解决这个问题。

    创建人类表:

mydb=#create table human(hid int,name varchar(20));

    创建leader表,继承人类表:

mydb=#create table leader(flag int default 1) inherits(human);

通过继承,leader表将继承它父表human的所有列。leader通过一个额外的flag列来表示它为leader。

mydb=# \d human资料表 "public.human"栏位 |         型别          | 修饰词 ------+-----------------------+--------hid  | integer               | name | character varying(20) | mydb=# \d leader资料表 "public.leader"栏位 |         型别          | 修饰词 ------+-----------------------+--------hid  | integer               | name | character varying(20) | flag | integer               | 缺省 1继承: human

查找所有的人

mydb=# select * from human;hid |  name  -----+--------1 | 小花2 | 小明3 | 小华4 | 小丽5 | 小李7 | 朱元璋8 | 特兰普

查找不是领导人的人

mydb=# select * from only human;hid | name -----+------1 | 小花2 | 小明3 | 小华4 | 小丽5 | 小李

查找领导人

mydb=# select * from leader;hid |  name  | flag -----+--------+------7 | 朱元璋 |    18 | 特兰普 |    1

2,分区

分区在某些情况下可以使得查询性能显著提升。

当查询或更新访问一个分区的大部分行时,可以通过该分区上的一个顺序扫描来取代分散到整个表上的索引和随机访问,这样可以改善性能。

如果需求计划使用划分设计,可以通过增加或移除分区来完成批量载入和删除。 ALTER TABLE NO INHERIT 和 DROP TABLE 都远快于一个批量操作。这些命令也完全避免了由批量 DELETE 造成的 VACUUM 负载。

很少使用的数据可以被迁移到便宜且较慢的存储介质上。

通过继承实现分区:

mydb=# create table login_log(login_id int not null,user_name varchar(20),login_time date);mydb=# create table login_log_201801(check(login_time>=DATE '2018-01-01' and login_time<=DATE '2018-01-31')) inherits(login_log);mydb=# create table login_log_201802(check(login_time>=DATE '2018-02-01' and login_time<=DATE '2018-02-28')) inherits(login_log);mydb=# create table login_log_201803(check(login_time>=DATE '2018-03-01' and login_time<=DATE '2018-03-31')) inherits(login_log);

在时间列上建立索引,确保性能:

mydb=# create index idx_login_log_201801_time on login_log_201801(login_time);mydb=# create index idx_login_log_201802_time on login_log_201802(login_time);mydb=# create index idx_login_log_201803_time on login_log_201803(login_time);

通过insert into login_log,利用触发器和函数,使得数据根据登陆日期重定向到不同的分区。

函数创建:

CREATE OR REPLACE FUNCTION insert_login_log()RETURNS TRIGGER AS $$BEGINif(new.login_time>=DATE '2018-01-01' and new.login_time<=DATE '2018-01-31') theninsert into login_log_201801 values(new.*);elsif(new.login_time>=DATE '2018-02-01' and new.login_time<=DATE '2018-02-28') theninsert into login_log_201802 values(new.*);elsif(new.login_time>=DATE '2018-03-01' and new.login_time<=DATE '2018-03-31') theninsert into login_log_201803 values(new.*);elseRAISE EXCEPTION 'Date	out of range!';end if;RETURN NULL;END;$$LANGUAGE plpgsql;

触发器创建:

CREATE TRIGGER insert_log_triggerBEFORE INSERT ON login_logFOR EACH ROW EXECUTE PROCEDURE insert_login_log();

数据录入:

insert into login_log values(1,'小明','2018-01-10');insert into login_log values(2,'小明','2018-02-13');insert into login_log values(3,'小明','2018-03-20');insert into login_log values(4,'小丽','2018-01-31');insert into login_log values(5,'小丽','2018-02-20');insert into login_log values(6,'小丽','2018-03-11');

查询全部数据:

mydb=# select * from login_log;login_id | user_name | login_time ----------+-----------+------------1 | 小明      | 2018-01-104 | 小丽      | 2018-01-312 | 小明      | 2018-02-135 | 小丽      | 2018-02-203 | 小明      | 2018-03-206 | 小丽      | 2018-03-11

查询分区表login_log_201801数据:

mydb=# select * from login_log_201801;login_id | user_name | login_time ----------+-----------+------------1 | 小明      | 2018-01-104 | 小丽      | 2018-01-31

查询分区表login_log_201802数据:

mydb=# select * from login_log_201802;login_id | user_name | login_time ----------+-----------+------------2 | 小明      | 2018-02-135 | 小丽      | 2018-02-20

查询分区表login_log_201803数据:

mydb=# select * from login_log_201803;login_id | user_name | login_time ----------+-----------+------------3 | 小明      | 2018-03-206 | 小丽      | 2018-03-11

3,注意点

a、分区表并不能完全的继承父表的所有属性,比如唯一约束、主键、外键。而检查约束与非空约束是可以继承的。

b、修改父表的结构,子表结构同时被修改。

c、reindex、vacuum命令不会影响到子表。

d、不要在父表上定义检查约束,除非你想约束所有分区。

e、不要在父表上创建索引和或唯一约束,因为没有任何意义。应该在每个分区上分别创建。

f、 合理的设计中,父表一般不存入数据,分区过滤时,父表的扫描代价为零。

g、在postgresql 10中,实现了分区的功能,用户可以通过相应语法直接实现分区功能,喜欢的朋友可以研究下。

http://www.lryc.cn/news/485721.html

相关文章:

  • 论文笔记(五十六)VIPose: Real-time Visual-Inertial 6D Object Pose Tracking
  • 微服务治理详解
  • “南海明珠”-黄岩岛(民主礁)领海基线WebGIS绘制实战
  • Oracle数据库 创建dblink的过程及其用法详解
  • Linux从0——1之shell编程4
  • pycharm快速更换虚拟环境
  • MVVM框架
  • 数据仓库在大数据处理中的作用
  • 前端Javascript、Vue、CSS等场景面试题目(二)
  • 鸿蒙学习生态应用开发能力全景图-开发者支持平台(5)
  • 计算机网络各层设备总结归纳(更新ing)
  • 3. Spring Cloud Eureka 服务注册与发现(超详细说明及使用)
  • 品牌如何利用大数据工具,进行消费者洞察分析?
  • 鸿蒙实现 web 传值
  • uniapp vuex的使用
  • RabbitMQ实战启程:从原理到部署的全方位探索(上)
  • 【论文复现】轻松利用自适应特征融合实现去雾
  • 【大数据学习 | HBASE高级】hbase-phoenix 与二次索引应用
  • 高级java每日一道面试题-2024年11月09日-缓存中间件篇-Redis和Memecache有什么区别?
  • vscode 关闭绑定元素 隐式具有“any”类型这类错误
  • 手机ip地址异常怎么解决
  • 【售前方案】工业园区整体解决方案,智慧园区方案,智慧城市方案,智慧各类信息化方案(ppt原件)
  • 37.超级简易的计算器 C语言
  • 防火墙----iptables
  • 若点集A=B则A必能恒等变换地变为B=A这一几何常识推翻直线(平面)公理
  • 网络安全之WINDOWS端口及病毒编写
  • Flink 开发工程应加载哪些依赖
  • wordpress建外贸独立站常用的多语言插件
  • [SpB]如何开始使用 Spring Boot?
  • 蓝桥杯模拟