Desempenho do SUBSTR no CLOB
Eu tenho um procedimento PL / SQL que faz um monte deSUBSTR
s em umVARCHAR2
parâmetro. Eu gostaria de remover o limite de comprimento, então eu tentei mudá-lo paraCLOB
.
Funciona bem, mas o desempenho sofre, então eu fiz alguns testes (com base emesses testes desde 2005).
ATUALIZAR: Eu posso reproduzir isso em várias instâncias diferentes com diferentes versões do Oracle e hardware diferente,dbms_lob.substr
é sempre perceptível mais devagar do quesubstr(CLOB)
e muito mais lento queSUBSTR(VARCHAR2)
.
Os resultados de Bob e os testes no link acima contam uma história diferente.
Alguém pode explicar isso, ou pelo menos reproduzir os resultados de Bob ou meus? Obrigado!
Resultado dos testes:
+000000000 00:00:00.004000000 (VARCHAR2)
+000000000 00:00:00.298000000 (CLOB SUBSTR)
+000000000 00:00:00.356000000 (DBMS_LOB.SUBSTR)
Código de teste:
<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>