(leugens, verdomme leugens en benchmarks...)
Ik heb je test 10 keer opnieuw uitgevoerd, waarbij ik de tekenreeks heb uitgebreid zodat deze 30 tekens lang was, en kreeg de volgende gemiddelde resultaten:
+000000000 00:00:00.011694200 (VARCHAR2)
+000000000 00:00:00.901000600 (CLOB SUBSTR)
+000000000 00:00:00.013169200 (DBMS_LOB.SUBSTR)
Ik veranderde toen het substringbereik in 5,14 (14,5 voor DBMS_LOB.SUBSTR) en kreeg:
+000000000 00:00:00.011731000 (VARCHAR2)
+000000000 00:00:01.010840000 (CLOB SUBSTR)
+000000000 00:00:00.011427000 (DBMS_LOB.SUBSTR)
Ik veranderde toen het bereik in 17,14 (14,17 voor DBMS_LOB.SUBSTR) en kreeg
+000000000 00:00:00.013578900 (VARCHAR2)
+000000000 00:00:00.964527400 (CLOB SUBSTR)
+000000000 00:00:00.011416800 (DBMS_LOB.SUBSTR)
Ten slotte heb ik het bereik gewijzigd in 25,14 (14,25 voor DBMS_LOB.SUBSTR) en kreeg
+000000000 00:00:00.011210200 (VARCHAR2)
+000000000 00:00:00.916439800 (CLOB SUBSTR)
+000000000 00:00:00.013781300 (DBMS_LOB.SUBSTR)
Mijn conclusie is dat wanneer je tegen CLOB's werkt, het het beste is om DBMS_LOB.SUBSTR te gebruiken, omdat het in feite geen prestatieverlies lijkt te hebben in vergelijking met het gebruik van SUBSTR tegen een "normale" VARCHAR2. SUBSTR tegen een CLOB lijkt een aanzienlijke prestatiestraf te hebben. Voor de goede orde - OS =HP/UX (Unix-variant), Oracle-versie=11.1, processor=HP Itanium 2-plex. YMMV.
Deel en geniet.
En omdat als het de moeite waard is om te overdrijven, zijn hier wat meer resultaten met de strings uitgebreid tot 32767 tekens. Subtekenreeksbereiken gegeven bij elke reeks resultaten:
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)
Zelfde dag, zelfde conclusie.
Cthulhu fhtagn.
(Nogmaals tot de bres, beste vrienden, nogmaals...)
Voer de benchmarks opnieuw uit, verander de grootte van de CLOB in 3276700 en neem de substring vanuit het midden vanaf 2475000 voor lengte 25000 krijg ik:
+000000000 00:00:00.176883200 (VARCHAR2)
+000000000 00:00:02.069482600 (CLOB SUBSTR)
+000000000 00:00:00.175341500 (DBMS_LOB.SUBSTR)
(Merk op dat wijzigingen alleen van invloed zijn op de laatste twee tests).
EN...dezelfde resultaten, andere dag.
YMMV.