Oracle
 sql >> Database >  >> RDS >> Oracle

Performance di SUBSTR su CLOB

(Bugie, dannazione bugie e parametri di riferimento...)

Ho eseguito nuovamente il test 10 volte, espandendo la stringa in modo che fosse lunga 30 caratteri e ho ottenuto i seguenti risultati medi:

+000000000 00:00:00.011694200 (VARCHAR2)
+000000000 00:00:00.901000600 (CLOB SUBSTR)
+000000000 00:00:00.013169200 (DBMS_LOB.SUBSTR)

Ho quindi modificato l'intervallo della sottostringa in 5,14 (14,5 per DBMS_LOB.SUBSTR) e ho ottenuto:

+000000000 00:00:00.011731000 (VARCHAR2)
+000000000 00:00:01.010840000 (CLOB SUBSTR)
+000000000 00:00:00.011427000 (DBMS_LOB.SUBSTR)

Ho quindi modificato l'intervallo in 17,14 (14,17 per DBMS_LOB.SUBSTR) e ho ottenuto

+000000000 00:00:00.013578900 (VARCHAR2)
+000000000 00:00:00.964527400 (CLOB SUBSTR)
+000000000 00:00:00.011416800 (DBMS_LOB.SUBSTR)

Alla fine, ho cambiato l'intervallo in 25,14 (14,25 per DBMS_LOB.SUBSTR) e ho ottenuto

+000000000 00:00:00.011210200 (VARCHAR2)
+000000000 00:00:00.916439800 (CLOB SUBSTR)
+000000000 00:00:00.013781300 (DBMS_LOB.SUBSTR)

La mia conclusione è che quando si lavora contro CLOB è meglio usare DBMS_LOB.SUBSTR in quanto sembra non avere effettivamente alcuna penalizzazione delle prestazioni rispetto all'utilizzo di SUBSTR contro un VARCHAR2 "normale". SUBSTR contro un CLOB sembra subire una significativa penalizzazione delle prestazioni. Per la cronaca - OS =HP/UX (variante Unix), versione Oracle=11.1, processore=HP Itanium 2-plex. YMMV.

Condividi e divertiti.

E poiché se vale la pena farlo vale la pena esagerare, ecco altri risultati con le stringhe espanse a 32767 caratteri. Intervalli di sottostringhe forniti con ogni set di risultati:

1, 25000
+000000000 00:00:00.198466400 (VARCHAR2)
+000000000 00:00:02.870958700 (CLOB SUBSTR)
+000000000 00:00:00.174490100 (DBMS_LOB.SUBSTR)

1000, 25000
+000000000 00:00:00.253447900 (VARCHAR2)
+000000000 00:00:02.491790500 (CLOB SUBSTR)
+000000000 00:00:00.193560100 (DBMS_LOB.SUBSTR)

10000, 25000
+000000000 00:00:00.217812000 (VARCHAR2)
+000000000 00:00:02.268794800 (CLOB SUBSTR)
+000000000 00:00:00.222200200 (DBMS_LOB.SUBSTR)

Stesso giorno, stessa conclusione.

Cthulhu fhtagn.

(Ancora una volta sulla breccia, cari amici, ancora una volta...)

Esegui nuovamente i benchmark, modificando la dimensione del CLOB in 3276700 e prendendo la sottostringa dal centro a partire da 2475000 per la lunghezza 25000 ottengo:

+000000000 00:00:00.176883200 (VARCHAR2)
+000000000 00:00:02.069482600 (CLOB SUBSTR)
+000000000 00:00:00.175341500 (DBMS_LOB.SUBSTR)

(Nota che le modifiche riguardano solo gli ultimi due test).

E...stessi risultati, giorno diverso.

YMMV.