Выступление СУБСТР на CLOB
У меня есть процедура PL / SQL, которая делает многоSUBSTR
наVARCHAR2
параметр. Я хотел бы удалить ограничение длины, поэтому я попытался изменить его наCLOB
.
Работает нормально, но производительность страдает, поэтому я сделал несколько тестов (на основеэти тесты с 2005 года).
UPDATE: Я могу воспроизвести это в нескольких разных экземплярах с разными версиями Oracle и разным оборудованием,dbms_lob.substr
всегда заметно медленнее, чемsubstr(CLOB)
и намного медленнее, чемSUBSTR(VARCHAR2)
.
Результаты Боба и тесты по ссылке выше рассказывают другую историю.
Может ли кто-нибудь объяснить это или хотя бы воспроизвести результаты Боба или мои результаты? Спасибо!
Test results:
+000000000 00:00:00.004000000 (VARCHAR2)
+000000000 00:00:00.298000000 (CLOB SUBSTR)
+000000000 00:00:00.356000000 (DBMS_LOB.SUBSTR)
Test code:
<code>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; </code>