У меня есть процедура PL/SQL, которая делает много SUBSTR
для параметра VARCHAR2
. Я хотел бы удалить ограничение длины, поэтому я попытался изменить его на CLOB
.
Работает нормально, но производительность страдает, поэтому я провел несколько тестов (на основе этих тестов с 2005 года).
UPDATE. Я могу воспроизвести это в нескольких разных экземплярах с разными версиями 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;