记Oracle regexp_substr 一拆多查询缓慢sql优化

需求简化描述:

Oralce 一条数据按照特定格式拆分成多行数据
如:1;2;3
拆分成:
1
2
3
源数据如图:数据样例如图

最开始我是这么写的


	SELECT DISTINCT
		REGEXP_SUBSTR( hscbzx, '[^;]+', 1, ROWNUM ) 
	FROM
		yszx
	WHERE
		id = '"+yszxId+"' 
		connect by LEVEL <=regexp_count(hscbzx, ';') + 1

执行速度惨不忍睹,直接创造纪录,去网上查了下,解释说是regexp_substr regexp_count ,都使用了正则,正则功能强大,但效率很低,然后还用了connect by 递归查询~,检查了下sql,把connect by 后面的regexp_count 优化了下,如下

改成了这样


	SELECT DISTINCT
		REGEXP_SUBSTR( hscbzx, '[^;]+', 1, ROWNUM ) 
	FROM
		yszx
	WHERE
		id = '"+yszxId+"' 
		connect by LEVEL <=LENGTH( hscbzx ) - LENGTH( REPLACE ( hscbzx, ';', '' ) ) + 1 

去掉了一个使用正则的函数,执行速度提升了一些,但是效果并不明显,然后把connect by 递归优化又优化了下(借鉴网上查到的大神优化的),个人理解是借助dual,把多层递归优化成了单层???有懂的哥们请指教,感激不尽

又改成了这样


	SELECT DISTINCT
		REGEXP_SUBSTR( hscbzx, '[^;]+', 1, ROWNUM ) 
	FROM
		yszx,
		( SELECT LEVEL l FROM DUAL CONNECT BY LEVEL <= 100 ) b 
	WHERE
		id = '"+yszxId+"' 
		AND 1 <= LENGTH( hscbzx ) - LENGTH( REPLACE ( hscbzx, ';', '' ) ) + 1 

执行结果如下,闪电般迅速,飘柔般丝滑,缺点是会产生空白记录~,使用distinct 去重后还是有一条多余的,很烦,暂时还没想到好的办法。
在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值