У меня есть процедура 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;