如何高效能拆分一个字段为多行
2012-09-24 11:57
337 查看
我本意是将表中的一个字段拆分成多行,例如'aaa,bbb'拆分为
'aaa'
'bbb'
现在测试如下:
返回结果如下:
--======================================================
看起来connect by之后产生了大量重复数据,于是加入distinct后取得正确数据。
反思:
我构造的测试数据仅仅只有三行,最长的拆分资料仅3段'eee,fff,ggg',却产生了21笔资料。如果测试数据增多,或者需拆分的段
数量增多,那么connect by产生的数据将是海量的。
用此种方法实际处理生产库数据时,问题马上显现出来,仅17笔资料,最长拆分字段为8段,竟然产生了738万笔资料,尽管我使用
了distinct,依然慢的很。
解决方案:用Join方式取代connect by方式
结论:
对于表资料只有一笔的时候,用connect by一般不会有什么问题。但如果表中资料是多笔,则connect by会产生海量的重复资料。
用join方式可解决此类问题。
'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),',',' ') c2 from t1 connect BY level<=length(c2)-length(replace(c2,',',''))+1 order by c1,level
返回结果如下:
C1 LEVEL C2 1 1 aaa 1 2 bbb 1 2 bbb 1 2 bbb 2 1 ccc 2 2 ddd 2 2 ddd 2 2 ddd 3 1 eee 3 2 fff 3 2 fff 3 2 fff 3 3 ggg 3 3 ggg 3 3 ggg 3 3 ggg 3 3 ggg 3 3 ggg 3 3 ggg 3 3 ggg 3 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.cnt ORDER BY c1
结论:
对于表资料只有一笔的时候,用connect by一般不会有什么问题。但如果表中资料是多笔,则connect by会产生海量的重复资料。
用join方式可解决此类问题。
相关文章推荐
- Oracle 如何将一个字段拆分成表
- 将一个表的字段拆分成多行
- 如何在一个业务繁忙的大表中增加一个并带有默认值的字段
- hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决?
- 如何快速开发一个支持高效、高并发的分布式ID生成器(三)
- 高效工程师系列(一) 如何找到一个利于自己成长的环境
- 如何实现一个与数据库表字段松耦合的j2ee应用
- oracle 如何将一个表的某个字段赋值给另一张表的某个字段
- 对于一个非常大的数,如何快速高效返回比它小的最大质数【腾讯笔试题】
- ORACLE如何将多条记录合并成一个字段
- 如何高效检查一个数组中是否包含某个值?
- 如何高效的结算一个正整数中二进制表示1的个数
- SQLServer中如何将一个字段的多个记录值合在一行显示
- SQLSERVER如何获取一个数据库中的所有表的名称、一个表中所有字段的名称
- 数据表中有字段time(类型为varchar),如何通过sql语句找出这个字段里力离当前最近的一个日期
- 如何向一个自增字段插值
- 如何建立一个高效的MYSQL
- 如何判断一个已知的表中是否存在某个字段,如果不存在就创建它.
- Gridview中合并单元格,某字段的内容相同时如何只显示一个,屏蔽相同列或行的内容
- 如何构建一个高效的敏捷团队