Rendimiento de SUBSTR en CLOB
Tengo un procedimiento PL / SQL que hace muchoSUBSTR
s 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>