上文写到字符串拆分的各种方法
行列转换之字符串拆分(解决方案合集)
性能测试得到了如下结论:
- 自定义函数是最快的,0.039s,数据量大是加并发会更有优势;
- 简单SUBSTR方法,次之,0.05s
- 正则表达式REGEXP_SUBSTR方法,较慢,4.22s
- XML转换方法,报错,长度不足。
由于字符串长度有限,本文将函数改成CLOB类型,再次进行测试。
其中除了自定义函数之外的3种方法,只要更改一下输入参数类型即可,代码不再重复了。
自定义函数的代码做了一部分改动:
create or replace function F_SPLITCLOB4(V_CLOB_IN CLOB,V_DELIMER VARCHAR2)
return t_vchars PIPELINED is
L_LOB CLOB;
l_vchars varchar2(4000):='';
n_end number(10);
n_offset number(10):=1;
begin
L_LOB:=V_CLOB_IN;
loop
n_end:=DBMS_LOB.instr(lob_loc => L_LOB,pattern => V_DELIMER,offset =>n_offset);
if nvl(n_end,0)>0 then
l_vchars:=DBMS_LOB.substr(L_LOB,n_end-n_offset,n_offset);
n_offset:=n_end+1;
else
l_vchars:=null;
end if;
pipe row( l_vchars );
exit when n_end=0;
end loop;
RETURN;
end F_SPLITCLOB4;
新建一个表,仅有一个clob类型字段,增加一条记录,长度是5000个字符,再对4个函数进行性能测试:
CREATE TABLE t_clob(COL CLOB);
SQL> DECLARE
2 TMP_CLOB CLOB;
3 BEGIN
4 DBMS_LOB.createtemporary(TMP_CLOB,FALSE);
5 DBMS_LOB.open(TMP_CLOB,DBMS_LOB.lob_readwrite);
6 DBMS_LOB.write(TMP_CLOB,4000,1,RPAD('A,',4000,'A,'));
7 DBMS_LOB.writeappend(TMP_CLOB,1000,RPAD('A,',1000,'A,'));
8 INSERT INTO t_clob VALUES(TMP_CLOB);
9 COMMIT;
10 DBMS_LOB.close(TMP_CLOB);
11 END;
12 /
SQL> select DBMS_LOB.getlength(COL) from t_clob;
DBMS_LOB.GETLENGTH(COL)
-----------------------
5000
SQL> select count(*) from (select * from table(select F_SPLITCLOB4(col,',') from t_clob));
COUNT(*)
----------
2501
Executed in 1.533 seconds
SQL> select count(*) from (select * from table(select F_SPLITCLOB3(col,',') from t_clob));
COUNT(*)
----------
2501
Executed in 1.064 seconds
SQL> select count(*) from (select * from table(select F_SPLITCLOB2(col,',') from t_clob));
COUNT(*)
----------
2501
Executed in 0.358 seconds
SQL> select count(*) from (select * from table(select F_SPLITCLOB1(col,',') from t_clob));
COUNT(*)
----------
2501
Executed in 1778.368 seconds
测试结果从最快到最慢分别如下:
1.简单SUBSTR方法,0.358S
2.XML转换方法,1.064S
3.自定义函数方法,1.533S
4.正则表达式方法,1778.368S
可见,正则表达式的方法效率大大低于其他几种方法,应该尽量少用。
版权声明:本文为yoursly原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。