POSTGRESQL 吊打 ORACLE 的“傲娇”

2019-06-21 15:52:40 浏览数 (1)

大早上的因为昨天的网络问题,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 不具备的功能。使用高级索引功能由胜之不武的嫌疑。

0 人点赞