【发布时间】:2012-05-07 02:19:19
【问题描述】:
我有一个 PL/SQL 过程,它在 VARCHAR2 参数上做了很多 SUBSTRs。我想取消长度限制,所以我尝试将其更改为CLOB。
工作正常,但性能受到影响,所以我做了一些测试(基于 2005 年的 these tests)。
更新:我可以在具有不同 Oracle 版本和不同硬件的多个不同实例上重现此问题,dbms_lob.substr 总是明显比substr(CLOB) 慢,并且比SUBSTR(VARCHAR2) 慢很多。
Bob 的结果和上面链接中的测试讲述了一个不同的故事。
谁能解释一下,或者至少重现 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;
【问题讨论】:
-
注意:测试三是
14,1,其他是1,14。我还会测试10000, 5000之类的东西,因为关键是您希望打破 VARCHAR 的 4k 限制。此外,由于非 VARCHAR 的结果大约慢 75 倍,您是否能够查看处理多个 VARCHAR 的算法? [比如一个规范化的表,其中一个字段是'sequence_id',显示这个字符串的相对位置,另一个是VARCHAR]。最后,虽然相对差异很大,但绝对差异很小。那么,有关系吗? [预优化] -
@Dems:感谢您的意见!
14,1和1,14是正确的(感谢 Oracle 提供一致的 API)。我试图打破32767字节限制(PL/SQL,而不是SQL),当使用具有该长度(LPAD('X', 32767, 'X'))的文本时,结果或多或少相同。我已经想到了那个多变量表解决方案,但我想避免它:) 这确实很重要,因为该过程确实经常被调用,但最重要的是我很好奇是否有替代方案...... -
在我的机器上 DBMS_LOB.SUBSTR 比 CLOB_SUBSTR(20%) 慢一点。两者都比 varchar2 慢(慢 70 倍)。我在 11gR2 上运行。
-
@FlorinGhita:谢谢!您使用的是哪个操作系统,以防万一?
-
AIX 6(不知道次要...2 或 3)。这是一台 128 核的 IBM 机器。你有什么操作系统和机器?
标签: sql oracle plsql oracle11g clob