SUBSTR在CLOB上的性能

Pet*_*ang 25 sql oracle plsql clob oracle11g

我有一个PL/SQL过程,它SUBSTRVARCHAR2参数上做了很多.我想删除长度限制,所以我尝试将其更改为CLOB.

工作正常,但性能受损,所以我做了一些测试(基于2005 年的这些测试).


更新:我可以在具有不同Oracle版本和不同硬件的几个不同实例上重现这一点,dbms_lob.substr总是明显慢于substr(CLOB),并且慢很多SUBSTR(VARCHAR2).

鲍勃的结果和上面链接中的测试讲述了一个不同的故事.

任何人都可以解释这个,或者至少复制鲍勃或我的结果?谢谢!


检测结果:

+000000000 00:00:00 004000000(VARCHAR2)
+000000000 00:00:00.298000000(CLOB SUBSTR)
+000000000 00:00:00.356000000(DBMS_LOB.SUBSTR)

测试代码:

DECLARE
  l_text   VARCHAR2(30) := 'This is a test record';
  l_clob   CLOB := l_text;
  l_substr VARCHAR2(30);
  t TIMESTAMP;
BEGIN
  t := SYSTIMESTAMP;
  FOR i IN 1..100000 LOOP
    l_substr := SUBSTR(l_text,1,14);
  END LOOP;
  dbms_output.put_line( SYSTIMESTAMP - t || ' (VARCHAR2)');

  t := SYSTIMESTAMP;
  FOR i IN 1..100000 LOOP
    l_substr := SUBSTR(l_clob,1,14);
  END LOOP;
  dbms_output.put_line( SYSTIMESTAMP - t || ' (CLOB SUBSTR)');

  t := SYSTIMESTAMP;
  FOR i IN 1..100000 LOOP
    l_substr := DBMS_LOB.SUBSTR(l_clob,14,1);
  END LOOP;
  dbms_output.put_line( SYSTIMESTAMP - t || ' (DBMS_LOB.SUBSTR)');
END;
Run Code Online (Sandbox Code Playgroud)

Bob*_*ica 17

(谎言,该死的谎言和基准......)

我重新测试你的测试10次,扩展字符串使其长达30个字符,得到以下平均结果:

+000000000 00:00:00.011694200 (VARCHAR2)
+000000000 00:00:00.901000600 (CLOB SUBSTR)
+000000000 00:00:00.013169200 (DBMS_LOB.SUBSTR)
Run Code Online (Sandbox Code Playgroud)

然后我将子串范围更改为5,14(DBMS_LOB.SUBSTR为14,5)并得到:

+000000000 00:00:00.011731000 (VARCHAR2)
+000000000 00:00:01.010840000 (CLOB SUBSTR)
+000000000 00:00:00.011427000 (DBMS_LOB.SUBSTR)
Run Code Online (Sandbox Code Playgroud)

然后我将范围更改为17,14(DBMS_LOB.SUBSTR为14,17)并获得

+000000000 00:00:00.013578900 (VARCHAR2)
+000000000 00:00:00.964527400 (CLOB SUBSTR)
+000000000 00:00:00.011416800 (DBMS_LOB.SUBSTR)
Run Code Online (Sandbox Code Playgroud)

最后,我将范围更改为25,14(DBMS_LOB.SUBSTR为14,25)并获得

+000000000 00:00:00.011210200 (VARCHAR2)
+000000000 00:00:00.916439800 (CLOB SUBSTR)
+000000000 00:00:00.013781300 (DBMS_LOB.SUBSTR)
Run Code Online (Sandbox Code Playgroud)

我的结论是,当针对CLOB工作时,最好使用DBMS_LOB.SUBSTR,因为与使用SUBSTR对抗"普通"VARCHAR2相比,它似乎实际上没有性能损失.针对CLOB的SUBSTR似乎遭受了显着的性能损失.记录 - OS = HP/UX(Unix变体),Oracle版本= 11.1,处理器= HP Itanium 2-plex.因人而异.

分享和享受.


并且因为如果值得做它值得过度做,这里有更多的结果,字符串扩展到32767个字符.每组结果给出的子串范围:

1, 25000
+000000000 00:00:00.198466400 (VARCHAR2)
+000000000 00:00:02.870958700 (CLOB SUBSTR)
+000000000 00:00:00.174490100 (DBMS_LOB.SUBSTR)

1000, 25000
+000000000 00:00:00.253447900 (VARCHAR2)
+000000000 00:00:02.491790500 (CLOB SUBSTR)
+000000000 00:00:00.193560100 (DBMS_LOB.SUBSTR)

10000, 25000
+000000000 00:00:00.217812000 (VARCHAR2)
+000000000 00:00:02.268794800 (CLOB SUBSTR)
+000000000 00:00:00.222200200 (DBMS_LOB.SUBSTR)
Run Code Online (Sandbox Code Playgroud)

同一天,同样的结论.

Cthulhu fhtagn.


(亲爱的朋友,再一次......)

重新运行基准测试,将CLOB的大小更改为3276700,从中间开始的子字符串从2475000开始,长度为25000我得到:

+000000000 00:00:00.176883200 (VARCHAR2)
+000000000 00:00:02.069482600 (CLOB SUBSTR)
+000000000 00:00:00.175341500 (DBMS_LOB.SUBSTR)
Run Code Online (Sandbox Code Playgroud)

(请注意,更改仅影响最后两个测试).

和...相同的结果,不同的一天.

因人而异.

  • "安腾...... YMMV" - 你的钱可能会消失吗? (4认同)