如何高效能拆分一个字段为多行
来源:互联网 发布:linux dns文件位置 编辑:程序博客网 时间:2024/06/08 19:07
我本意是将表中的一个字段拆分成多行,例如'aaa,bbb'拆分为
'aaa'
'bbb'
返回结果如下:
--======================================================
看起来connect by之后产生了大量重复数据,于是加入distinct后取得正确数据。
反思:
我构造的测试数据仅仅只有三行,最长的拆分资料仅3段'eee,fff,ggg',却产生了21笔资料。如果测试数据增多,或者需拆分的段
数量增多,那么connect by产生的数据将是海量的。
用此种方法实际处理生产库数据时,问题马上显现出来,仅17笔资料,最长拆分字段为8段,竟然产生了738万笔资料,尽管我使用
了distinct,依然慢的很。
结论:
'aaa'
'bbb'
现在测试如下:
with t1 as ( select 3 c1,'eee,fff,ggg' c2 from dual UNION ALL select 2 c1,'ccc,ddd' c2 from dual UNION ALL SELECT 1 c1,'aaa,bbb' c2 FROM dual)select c1,LEVEL,replace(regexp_substr(c2,'[^,]+',1,level),',',' ') c2from t1 connect BY level<=length(c2)-length(replace(c2,',',''))+1order by c1,level
返回结果如下:
C1 LEVEL C21 1 aaa1 2 bbb1 2 bbb1 2 bbb2 1 ccc2 2 ddd2 2 ddd2 2 ddd3 1 eee3 2 fff3 2 fff3 2 fff3 3 ggg3 3 ggg3 3 ggg3 3 ggg3 3 ggg3 3 ggg3 3 ggg3 3 ggg3 3 ggg
--======================================================
看起来connect by之后产生了大量重复数据,于是加入distinct后取得正确数据。
反思:
我构造的测试数据仅仅只有三行,最长的拆分资料仅3段'eee,fff,ggg',却产生了21笔资料。如果测试数据增多,或者需拆分的段
数量增多,那么connect by产生的数据将是海量的。
用此种方法实际处理生产库数据时,问题马上显现出来,仅17笔资料,最长拆分字段为8段,竟然产生了738万笔资料,尽管我使用
了distinct,依然慢的很。
解决方案:用Join方式取代connect by方式
with t1 as ( select 3 c1,'eee,fff,ggg' c2 from dual UNION ALL select 2 c1,'ccc,ddd' c2 from dual UNION ALL SELECT 1 c1,'aaa,bbb' c2 FROM dual)SELECT c1, substr(t.ca, instr(t.ca, ',', 1, d.lv) + 1, instr(t.ca, ',', 1, d.lv + 1) - (instr(t.ca, ',', 1, d.lv) + 1)) AS d FROM (SELECT c1, ',' || c2 || ',' AS ca, length(c2 || ',') - nvl(length(REPLACE(c2, ',')), 0) AS cnt FROM t1) t, (select rownum lv from (select max(length(c2 || ',') - nvl(length(REPLACE(c2, ',')), 0)) mlc from t1) connect by level<=mlc )d WHERE d.lv <= t.cntORDER BY c1
结论:
对于表资料只有一笔的时候,用connect by一般不会有什么问题。但如果表中资料是多笔,则connect by会产生海量的重复资料。
用join方式可解决此类问题。
- 如何高效能拆分一个字段为多行
- 拆分一个字段为多个字段
- 一个字段拆分为两个字段
- mysql把一字段拆分为多行
- 如何把一个PDF文档拆分为多个文档
- 如何将多个vmdk文件合并为一个或者将一个vmdk文件拆分为多个
- Oracle 如何将一个字段拆分成表
- 将逗号分割的clob字段转化为varchar,并将字符串拆分为多行
- 拆分一个Excel文件为多个
- Sqlserver根据某字段分隔符将一条记录拆分为多行记录
- mysql把表中某一字段拆分为多列
- 如何将一个PDF文件页面进行的拆分为多个PDF文件
- 将表中一个字段拆分成多列 oracle db2字段拆分
- SQL 多条记录整合到一个字段 一个字段拆分多条记录
- 字符串拆分为一个表
- 将一个表的字段拆分成多行
- Oracle中将一个字段拆分成多个行记录
- 拆分一个单元表为多个单元簿
- 关于青春
- 设计模式/建造模式
- Handler中Runnable 并不是新开一个线程
- centos安装php后apache无法启动
- vmware安装
- 如何高效能拆分一个字段为多行
- 一个分页存储过程【鸡蛋】
- HTML5与HTML4的10个关键区别
- 如何在安装了双系统的机器上修改默认启动系统(Linux,Windows)
- 中国控制两大军事战略要地:印度军队咽喉被紧锁
- 又见一帘幽梦
- TCP状态迁移图浅析
- Linux环境进程间通信 信号
- 一个通用分页查询方法