(Lögner, fan lögner och riktmärken...)
Jag körde ditt test igen 10 gånger, utökade strängen så att den var hela 30 tecken lång och fick följande genomsnittliga resultat:
+000000000 00:00:00.011694200 (VARCHAR2)
+000000000 00:00:00.901000600 (CLOB SUBSTR)
+000000000 00:00:00.013169200 (DBMS_LOB.SUBSTR)
Jag ändrade sedan delsträngsintervallet till 5,14 (14,5 för DBMS_LOB.SUBSTR) och fick:
+000000000 00:00:00.011731000 (VARCHAR2)
+000000000 00:00:01.010840000 (CLOB SUBSTR)
+000000000 00:00:00.011427000 (DBMS_LOB.SUBSTR)
Jag ändrade sedan intervallet till 17,14 (14,17 för DBMS_LOB.SUBSTR) och fick
+000000000 00:00:00.013578900 (VARCHAR2)
+000000000 00:00:00.964527400 (CLOB SUBSTR)
+000000000 00:00:00.011416800 (DBMS_LOB.SUBSTR)
Slutligen ändrade jag intervallet till 25,14 (14,25 för DBMS_LOB.SUBSTR) och fick
+000000000 00:00:00.011210200 (VARCHAR2)
+000000000 00:00:00.916439800 (CLOB SUBSTR)
+000000000 00:00:00.013781300 (DBMS_LOB.SUBSTR)
Min slutsats är att när man arbetar mot CLOB:s är det bäst att använda DBMS_LOB.SUBSTR eftersom det faktiskt inte verkar ha någon prestationsstraff jämfört med att använda SUBSTR mot en "normal" VARCHAR2. SUBSTR mot en CLOB verkar lida av ett betydande prestationsstraff. För protokollet - OS =HP/UX (Unix-variant), Oracle-version=11.1, processor=HP Itanium 2-plex. YMMV.
Dela och njut.
Och eftersom om det är värt att göra det är det värt att överdriva, här är några fler resultat med strängarna utökade till 32767 tecken. Delsträngintervall som anges med varje uppsättning resultat:
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)
Samma dag, samma slutsats.
Cthulhu fhtagn.
(Ännu en gång till bristningen, kära vänner, ännu en gång...)
Körde om riktmärkena, ändrade storleken på CLOB till 3276700 och tar delsträngen från mitten med början på 2475000 för längden 25000 får jag:
+000000000 00:00:00.176883200 (VARCHAR2)
+000000000 00:00:02.069482600 (CLOB SUBSTR)
+000000000 00:00:00.175341500 (DBMS_LOB.SUBSTR)
(Observera att ändringar endast påverkar de två sista testerna).
OCH...samma resultat, annan dag.
YMMV.