Wydajność SUBSTR na CLOB
Mam procedurę PL / SQL, która robi dużoSUBSTR
s 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>