行列转换之字符串拆分(CLOB版)

  • Post author:
  • Post category:其他


上文写到字符串拆分的各种方法


行列转换之字符串拆分(解决方案合集)


性能测试得到了如下结论:

  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;
  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 版权协议,转载请附上原文出处链接和本声明。