Pet*_*ang 25 sql oracle plsql clob oracle11g
我有一个PL/SQL过程,它SUBSTR在VARCHAR2参数上做了很多.我想删除长度限制,所以我尝试将其更改为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)
(请注意,更改仅影响最后两个测试).
和...相同的结果,不同的一天.
因人而异.
| 归档时间: |
|
| 查看次数: |
19505 次 |
| 最近记录: |