Oracle 性能之坑

需求

根据分组之后,对某个字段进行连接。

实现方式

主要的实现方式有以下两种:

select LISTAGG(id,,) WITHIN GROUP( ORDER BY depon),sum(salary),depon 
from test_1 
group by depon;

select wm_concat(id) ,sum(salary),depon 
from test_1 
group by depon

wm_concat 的坑

不同的 oracle 版本这个方法的表现是不同的,比如 11g R2 这个返回值可能是 blob。所以使用的时候就要:

to_char(wm_concat(id))

然而,这只是一个坑的开始。

当数据量多的时候,to_char(wm_concat(id)) 这个方法的性能贼差。

而且这个方法不是 oracle 自带的,所以会出现版本的兼容性问题。要慎用。

LISTAGG

为了解决性能问题,只能选择这个方式。

这个方法的缺点:

  1. 对版本有要求。最低版本要求 11g R2

  2. 写起来麻烦了点。

如果你很不幸运,有需要实现,版本又不够。那你可能要自己写一个函数了。

自定义连接函数

oracle 函数用的也不多,但是和 sql 也类似。

mybatis 分页插件的坑

以前用 mybatis 插件,都好好的。

但是这一次发生了一个严重的问题,那就是一个慢 SQL 比如要 7-10S 左右的时间,使用分页插件,直接就会进入假死。

也就是主线程一直在等待 mapper 的返回结果,但是一直没有返回结果。

为了避免这个大坑,有两种处理方式:

  1. 设置处理库的链接超时。但是治标不治本。按理说 10S 执行完的 sql 还是会一直卡到 timeout 异常。

  2. 手动实现分页。

参考资料

oracle拼接字段和group by的使用

Oracle10g自定义聚合函数(字符串拼接)

自定义聚集函数