(Løgn, for pokker løgne og benchmarks...)
Jeg kørte din test igen 10 gange, udvidede strengen, så den var på hele 30 tegn, og jeg fik følgende gennemsnitlige resultater:
+000000000 00:00:00.011694200 (VARCHAR2)
+000000000 00:00:00.901000600 (CLOB SUBSTR)
+000000000 00:00:00.013169200 (DBMS_LOB.SUBSTR)
Jeg ændrede derefter understrengområdet til 5,14 (14,5 for DBMS_LOB.SUBSTR) og fik:
+000000000 00:00:00.011731000 (VARCHAR2)
+000000000 00:00:01.010840000 (CLOB SUBSTR)
+000000000 00:00:00.011427000 (DBMS_LOB.SUBSTR)
Jeg ændrede derefter området til 17,14 (14,17 for DBMS_LOB.SUBSTR) og fik
+000000000 00:00:00.013578900 (VARCHAR2)
+000000000 00:00:00.964527400 (CLOB SUBSTR)
+000000000 00:00:00.011416800 (DBMS_LOB.SUBSTR)
Til sidst ændrede jeg området til 25,14 (14,25 for DBMS_LOB.SUBSTR) og fik
+000000000 00:00:00.011210200 (VARCHAR2)
+000000000 00:00:00.916439800 (CLOB SUBSTR)
+000000000 00:00:00.013781300 (DBMS_LOB.SUBSTR)
Min konklusion er, at når man arbejder mod CLOB'er, er det bedst at bruge DBMS_LOB.SUBSTR, da det ser ud til at have ingen præstationsstraf sammenlignet med at bruge SUBSTR mod en "normal" VARCHAR2. SUBSTR mod en CLOB ser ud til at lide under en betydelig præstationsstraf. For ordens skyld - OS =HP/UX (Unix-variant), Oracle-version=11.1, processor=HP Itanium 2-plex. YMMV.
Del og nyd.
Og fordi hvis det er værd at gøre, er det værd at overdrive, her er nogle flere resultater med strengene udvidet til 32767 tegn. Understrengsintervaller angivet med hvert sæt resultater:
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)
Samme dag, samme konklusion.
Cthulhu fhtagn.
(Endnu en gang til brud, kære venner, endnu en gang...)
Kør benchmarks igen, ændre størrelsen på CLOB til 3276700 og tage understrengen fra midten startende ved 2475000 for længde 25000 får jeg:
+000000000 00:00:00.176883200 (VARCHAR2)
+000000000 00:00:02.069482600 (CLOB SUBSTR)
+000000000 00:00:00.175341500 (DBMS_LOB.SUBSTR)
(Bemærk, at ændringer kun påvirker de sidste to tests).
OG...samme resultater, anden dag.
YMMV.