Oracle
 sql >> Base de données >  >> RDS >> Oracle

Performances de SUBSTR sur CLOB

(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.