Ho una procedura PL/SQL che esegue molto SUBSTR
s su un parametro VARCHAR2
. Vorrei rimuovere il limite di lunghezza, quindi ho provato a cambiarlo in CLOB
.Prestazioni di SUBSTR su CLOB
Funziona bene, ma le prestazioni ne soffrono, quindi ho eseguito alcuni test (basato su these tests dal 2005).
UPDATE: posso riprodurre questo su diversi casi diversi con diverse versioni di Oracle e hardware differente, dbms_lob.substr
è sempre evidente più lento di substr(CLOB)
, e molto più lento di SUBSTR(VARCHAR2)
.
I risultati di Bob e i test nel link sopra raccontano una storia diversa.
Qualcuno può spiegare questo, o almeno riprodurre i risultati di Bob o dei miei? Grazie!
I risultati dei test:
+000000000 00:00:00. (VARCHAR2)
+000000000 00:00:00. (CLOB SUBSTR)
+000000000 00:00:00. 356.000.000 (DBMS_LOB.SUBSTR) Codice
prova:
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;
Nota: il test tre è '14,1' dove gli altri sono' 1,14'. Proverò anche qualcosa come "10000, 5000" perché il punto è che stai cercando di infrangere il limite di 4k di VARCHAR.Inoltre, poiché i risultati sono circa 75x più lenti per non VARCHAR, sei in grado di esaminare un algoritmo che si occupa di più VARCHAR? * [Come una tabella normalizzata in cui un campo è il 'sequence_id' che mostra la posizione relativa di questa stringa e l'altro è il VARCHAR] *. Infine, sebbene vi sia una grande differenza * relativa *, la differenza * absolute * è bassa. Quindi, importa? * [Pre-ottimizzazione] * – MatBailie
@Dems: Grazie per il tuo contributo! '14,1' e' 1,14' sono corretti (grazie a Oracle per le API coerenti). Sto cercando di interrompere il limite di byte '32767' (PL/SQL, non SQL), e i risultati sono più o meno gli stessi quando si usa il testo con quella lunghezza' (LPAD ('X', 32767, 'X')) '. Ho pensato a questa soluzione a più tavoli varchar, ma mi piacerebbe evitarlo :) Ed è importante, dato che la procedura viene chiamata molto spesso, ma soprattutto sono curioso di sapere se ci sono alternative ... –
Sulle mie macchine DBMS_LOB.SUBSTR è leggermente più lento di CLOB_SUBSTR (20%). Ed entrambi mooore più lentamente di varchar2 (70 volte più lento). Corro su 11gR2. –