大早上的因为昨天的网络问题,MGR 的一台机器就unreachable, 按照流程将节点添加进原来的集群,失败failed, 搞了一上午,终于把集群 successful, 看了网络不好MGR 这个东西还是要小心,要不心脏受不了。
话归正传,今天为什么要说POSTGRESQL ,没法不说,目前从各种渠道得到的消息,ORACLE 正在被国有,股份制银行慢慢剔除,中国银行, 工商银行都在向MYSQL靠拢,如果你看了邮储银行的数据管理岗的招聘信息,你就知道连这样的银行都要会POSTGRESQL,留给ORACLE的时间不知道还有多少,过剩只能廉价,稀缺的必然高价,这是必然。
POSTGRESQL 吊打 ORACLE 的傲娇,什么是ORACLE 的傲娇,其中个人觉得,ORACLE 处理复杂语句的各种高级SQL 是傲视群雄的一个碉堡,哪怕SQL SERVER 在这些功能上也一直是要让ORACLE 三分。那POSTGRESQL 怎么吊打 ORACLE 处理高级SQL 的功能。
首先介绍一下这个表的情况,避免有闲言碎语说表结构特殊, 从图中看有这几个字段,region 字段是一个BIGINT 的数字自增列,country 列式MD5 随机的计算值,year是插入数据的时的系统时间,region_class是一个根据 region 的数字范围 进行归类的列,例如1000 内的region 是1 ,其他的是2 3 以此类推,其中也有NULL , 顺便说一句自动插入数据1千万这台8G 的破机器3.6秒就完成了。
应用分组集
目的:通过region_class 来进行分组并且每组要求取最大的region 数。
select region_class,max(region) as max_in from kill_O where region < 100000 and region_class is not null group by ROLLUP (region_class); 耗时 181ms 没有任何索引
加大难度:本次查询其实没有任何意义,仅仅是为了加大查询的难度,依然没有任何索引。在多字段分组,并且进行排序,时间1009ms
select region_class,sum(region) as sum_in from kill_O where region < 100000 and region_class is not null group by ROLLUP (region_class,region) order by region_class
经过查看了执行计划,POSTGRESQL 启用了并行扫描
如果在计算中,我们在进行多个字段GROUP BY 时 希望的是举例 GROUP BY 1 2 的数据 一次性获取更多的统计数据 希望以此能获得 group by 1 2 group by 1 group 2 的数据,POSTGRESQL 可以做吗?YES
select region_class,sum(region) as sum_in from kill_O
where region < 100000 and region_class is not null
group by cube (region_class,region)
继续不使用索引,3892ms 完成了整体的计算
继续提高要求,目前需要 GROUP (1 2) ROLLUP GROUP 1 ROLLUP GROUP 2 ROLLUP
POSTGRESQL 可以做吗,YES
select region_class,sum(region) as sum_in from kill_O
where region < 100000 and region_class is not null
GROUP BY GROUPING SETS (region_class,region)
不添加索引的情况下,2113ms 完成
如此就完事了,没有,难度还的继续。
我们在进行分组的时候,select 后面的 字段需要进行分割显示,例如
我统计 一车水果,通过水果的 好 或 坏来进行分类,但显示的时候,要对苹果,香蕉,芒果来分别显示他们的好 和坏的 总数量。
POSTGRESQL 能做这样的事情吗 YES
select region_class,
sum(region) filter(where year >'2019-04-19 10:43:33' and year < '2019-04-19 10:44:33' )
from kill_O
where region < 100000 and region_class is not null
group by (region_class); 191ms 完成
依然是没有加索引。
这没有完,继续,在统计分析中有一个概念叫中位数概念,这个概念是抛弃所有数据的50%后,在做统计,当然也可以调整,抛弃更多的数据或留下更多的数据。
具体还是看下面的语句把,都完成了。
秒级完成。
窗口函数,这个POSTGRESQL 也不能放过,看看他能做些什么
1 OVER
2 Partition by
partition by 加条件也是OK 的。并且 partition by order by 也没有问题
么最后我们还可以进行
而我们最常用的就是对我们查询的记录进行重新的排序编号
当然 POSTGRESQL 在数据库处理方面的函数也是一大把 简单列举一些
LEAD()
LAG()
可以对数据进行差别对比使用,方便出一些常用的数据对比报表使用。
first_value()
nth_value()
last_value()
row_number()
函数等等
同时还可以创建自己的聚集,方便定制化的功能。
最后,为什么在整体的操作中都没有索引的出现,主要是由于POSTGRESQL的索引分类众多,很多是ORACLE 不具备的功能。使用高级索引功能由胜之不武的嫌疑。