POSTGRESQL 吊打 ORACLE 的“傲娇”

大早上的因为昨天的网络问题,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秒就完成了。

POSTGRESQL 吊打 ORACLE 的“傲娇”

  应用分组集

目的:通过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  没有任何索引

POSTGRESQL 吊打 ORACLE 的“傲娇”

加大难度:本次查询其实没有任何意义,仅仅是为了加大查询的难度,依然没有任何索引。在多字段分组,并且进行排序,时间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 吊打 ORACLE 的“傲娇”

经过查看了执行计划,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 完成

POSTGRESQL 吊打 ORACLE 的“傲娇”

如此就完事了,没有,难度还的继续。

我们在进行分组的时候,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 完成

POSTGRESQL 吊打 ORACLE 的“傲娇”

依然是没有加索引。

这没有完,继续,在统计分析中有一个概念叫中位数概念,这个概念是抛弃所有数据的50%后,在做统计,当然也可以调整,抛弃更多的数据或留下更多的数据。

具体还是看下面的语句把,都完成了。

POSTGRESQL 吊打 ORACLE 的“傲娇”

秒级完成。

窗口函数,这个POSTGRESQL 也不能放过,看看他能做些什么

1 OVER 

POSTGRESQL 吊打 ORACLE 的“傲娇”

2 Partition by 

POSTGRESQL 吊打 ORACLE 的“傲娇”

POSTGRESQL 吊打 ORACLE 的“傲娇”

partition by 加条件也是OK 的。并且 partition by order by 也没有问题

POSTGRESQL 吊打 ORACLE 的“傲娇”

么最后我们还可以进行

而我们最常用的就是对我们查询的记录进行重新的排序编号

POSTGRESQL 吊打 ORACLE 的“傲娇”

当然 POSTGRESQL 在数据库处理方面的函数也是一大把 简单列举一些

LEAD()

LAG()

可以对数据进行差别对比使用,方便出一些常用的数据对比报表使用。

first_value()

nth_value()

last_value()

row_number()

函数等等

同时还可以创建自己的聚集,方便定制化的功能。

最后,为什么在整体的操作中都没有索引的出现,主要是由于POSTGRESQL的索引分类众多,很多是ORACLE 不具备的功能。使用高级索引功能由胜之不武的嫌疑。

相关文章: