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
为了解决性能问题,只能选择这个方式。
这个方法的缺点:
-
对版本有要求。最低版本要求 11g R2
-
写起来麻烦了点。
如果你很不幸运,有需要实现,版本又不够。那你可能要自己写一个函数了。
自定义连接函数
oracle 函数用的也不多,但是和 sql 也类似。
mybatis 分页插件的坑
以前用 mybatis 插件,都好好的。
但是这一次发生了一个严重的问题,那就是一个慢 SQL 比如要 7-10S 左右的时间,使用分页插件,直接就会进入假死。
也就是主线程一直在等待 mapper 的返回结果,但是一直没有返回结果。
为了避免这个大坑,有两种处理方式:
-
设置处理库的链接超时。但是治标不治本。按理说 10S 执行完的 sql 还是会一直卡到 timeout 异常。
-
手动实现分页。