Выступление СУБСТР на 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>

Ответы на вопрос(4)

Ваш ответ на вопрос