我有一个 PL/SQL 过程,它在参数上做了很多SUBSTR
s 。VARCHAR2
我想删除长度限制,所以我尝试将其更改为CLOB
.
工作正常,但性能受到影响,所以我做了一些测试(基于2005 年的这些测试)。
更新:我可以在具有不同 Oracle 版本和不同硬件的几个不同实例上重现这一点,dbms_lob.substr
总是明显慢substr(CLOB)
于SUBSTR(VARCHAR2)
.
Bob 的结果和上面链接中的测试讲述了一个不同的故事。
任何人都可以解释这一点,或者至少重现鲍勃或我的结果吗?谢谢!
试验结果:
+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;