Производительность SUBSTR для CLOB

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

25
задан Peter Lang 27 April 2012 в 06:34
поделиться