(Mensonges, putain mensonges, et repères...)
J'ai relancé votre test 10 fois, en élargissant la chaîne pour qu'elle contienne 30 caractères complets, et j'ai obtenu les résultats moyens suivants :
+000000000 00:00:00.011694200 (VARCHAR2)
+000000000 00:00:00.901000600 (CLOB SUBSTR)
+000000000 00:00:00.013169200 (DBMS_LOB.SUBSTR)
J'ai ensuite changé la plage de sous-chaînes en 5,14 (14,5 pour DBMS_LOB.SUBSTR) et j'ai obtenu :
+000000000 00:00:00.011731000 (VARCHAR2)
+000000000 00:00:01.010840000 (CLOB SUBSTR)
+000000000 00:00:00.011427000 (DBMS_LOB.SUBSTR)
J'ai ensuite changé la plage en 17,14 (14,17 pour DBMS_LOB.SUBSTR) et j'ai obtenu
+000000000 00:00:00.013578900 (VARCHAR2)
+000000000 00:00:00.964527400 (CLOB SUBSTR)
+000000000 00:00:00.011416800 (DBMS_LOB.SUBSTR)
Enfin, j'ai changé la plage à 25,14 (14,25 pour DBMS_LOB.SUBSTR) et j'ai obtenu
+000000000 00:00:00.011210200 (VARCHAR2)
+000000000 00:00:00.916439800 (CLOB SUBSTR)
+000000000 00:00:00.013781300 (DBMS_LOB.SUBSTR)
Ma conclusion est que lorsque vous travaillez contre CLOB, il est préférable d'utiliser DBMS_LOB.SUBSTR car il semble n'avoir effectivement aucune pénalité de performance par rapport à l'utilisation de SUBSTR contre un VARCHAR2 "normal". SUBSTR contre un CLOB semble souffrir d'une pénalité de performance significative. Pour mémoire - OS =HP/UX (variante Unix), Oracle version=11.1, processeur=HP Itanium 2-plex. YMMV.
Partagez et profitez.
Et parce que si ça vaut le coup, ça vaut la peine d'en faire trop, voici quelques résultats supplémentaires avec les chaînes étendues à 32767 caractères. Plages de sous-chaînes fournies avec chaque ensemble de résultats :
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)
Même jour, même conclusion.
Cthulhu fhtagn.
(Une fois de plus à la brèche, chers amis, une fois de plus...)
Relancez les benchmarks, en changeant la taille du CLOB en 3276700, et en prenant la sous-chaîne du milieu à partir de 2475000 pour une longueur de 25000, j'obtiens :
+000000000 00:00:00.176883200 (VARCHAR2)
+000000000 00:00:02.069482600 (CLOB SUBSTR)
+000000000 00:00:00.175341500 (DBMS_LOB.SUBSTR)
(Notez que les modifications n'affectent que les deux derniers tests).
ET... mêmes résultats, jour différent.
YMMV.