上文写到字符串拆分的各种方法
行列转换之字符串拆分(解决方案合集)
性能测试得到了如下结论:

  1. 自定义函数是最快的,0.039s,数据量大是加并发会更有优势;
  2. 简单SUBSTR方法,次之,0.05s
  3. 正则表达式REGEXP_SUBSTR方法,较慢,4.22s
  4. 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(*) from (select * from table(select F_SPLITCLOB4(col,',') from t_clob));
  COUNT(*)
----------
Executed in 1.533 seconds
SQL> select count(*) from (select * from table(select F_SPLITCLOB3(col,',') from t_clob));
  COUNT(*)
----------
Executed in 1.064 seconds
SQL> select count(*) from (select * from table(select F_SPLITCLOB2(col,',') from t_clob));
  COUNT(*)
----------
Executed in 0.358 seconds
SQL> select count(*) from (select * from table(select F_SPLITCLOB1(col,',') from t_clob));
  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