Wydajność SUBSTR na CLOB

Mam procedurę PL / SQL, która robi dużoSUBSTRs na aVARCHAR2 parametr. Chciałbym usunąć limit długości, więc próbowałem go zmienić naCLOB.

Działa dobrze, ale wydajność cierpi, więc zrobiłem kilka testów (na podstawiete testy od 2005).

AKTUALIZACJA: Mogę to odtworzyć w kilku różnych przypadkach z różnymi wersjami Oracle i innym sprzętem,dbms_lob.substr jest zawsze zauważalnie wolniejszy niżsubstr(CLOB)i dużo wolniej niżSUBSTR(VARCHAR2).

Wyniki Boba i testy w powyższym linku przedstawiają inną historię.

Czy ktoś może to wyjaśnić, a przynajmniej odtworzyć wyniki Boba lub moje? Dzięki!

Wyniki testów:

+000000000 00:00:00.004000000 (VARCHAR2)
+000000000 00:00:00.298000000 (CLOB SUBSTR)
+000000000 00:00:00.356000000 (DBMS_LOB.SUBSTR)

Kod testowy:

<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>

questionAnswers(4)

yourAnswerToTheQuestion