Rendimiento de SUBSTR en CLOB

Tengo un procedimiento PL / SQL que hace muchoSUBSTRs en unVARCHAR2 parámetro. Me gustaría eliminar el límite de longitud, así que intenté cambiarlo aCLOB.

Funciona bien, pero el rendimiento se resiente, así que hice algunas pruebas (basadas enestas pruebas desde 2005).

ACTUALIZAR: Puedo reproducir esto en varias instancias diferentes con diferentes versiones de Oracle y hardware diferente,dbms_lob.substr Siempre se nota más lento quesubstr(CLOB), y mucho mas lento queSUBSTR(VARCHAR2).

Los resultados de Bob y las pruebas en el enlace anterior cuentan una historia diferente.

¿Alguien puede explicar esto, o al menos reproducir los resultados de Bob o mis resultados? ¡Gracias!

Resultados de la prueba:

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

Código de prueba:

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

Respuestas a la pregunta(4)

Su respuesta a la pregunta