上文写到字符串拆分的各种方法
行列转换之字符串拆分(解决方案合集)
性能测试得到了如下结论:
-
自定义函数是最快的,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;
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;
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;
SQL> select DBMS_LOB.getlength(COL) from t_clob;
DBMS_LOB.GETLENGTH(COL)
-----------------------
SQL> select count
----------
Executed in 1.533 seconds
SQL> select count
----------
Executed in 1.064 seconds
SQL> select count
----------
Executed in 0.358 seconds
SQL> select count
----------
Executed in 1778.368 seconds
测试结果从最快到最慢分别如下:
1.简单SUBSTR方法,0.358S
2.XML转换方法,1.064S
3.自定义函数方法,1.533S
4.正则表达式方法,1778.368S
可见,正则表达式的方法效率大大低于其他几种方法,应该尽量少用。
上文写到字符串拆分的各种方法 行列转换之字符串拆分(解决方案合集) 性能测试得到了如下结论: 自定义函数是最快的,0.039s,数据量大是加并发会更有优势; 简单SUBSTR方法,次之,0.05s 正则表达式REGEXP_SUBSTR方法,较慢,4.22s XML转换方法,报错,长度不足。 由于字符串长度有限,本文将函数改成CLOB类型,再次进行测试。...
SQL> select * From v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
--方法一
SELECT d.dept_name,wm_concat(e.emp_name) FROM employee e
INNER JOIN department d ON d.dept_id=e.dept_id
GROUP BY d.dept_name;
执行结果:
SELECT DISTINCT STUID,
REGEXP_SUBSTR (STUNAME, '[^,]+', 1, LEVEL) STUNAME, STUSEX
FROM T_STU
CONNECT BY LEVEL REPLACE(STUNAME, ',', '')) + 1
ORDER BY STUID;
SELECT STUID,
REGEX