(Лъжи, по дяволите лъжи и показатели...)
Проведох отново вашия тест 10 пъти, разширявайки низа, така че да е дълъг цели 30 знака и получих следните осреднени резултати:
+000000000 00:00:00.011694200 (VARCHAR2)
+000000000 00:00:00.901000600 (CLOB SUBSTR)
+000000000 00:00:00.013169200 (DBMS_LOB.SUBSTR)
След това промених диапазона на поднизовете на 5,14 (14,5 за DBMS_LOB.SUBSTR) и получих:
+000000000 00:00:00.011731000 (VARCHAR2)
+000000000 00:00:01.010840000 (CLOB SUBSTR)
+000000000 00:00:00.011427000 (DBMS_LOB.SUBSTR)
След това промених диапазона на 17,14 (14,17 за DBMS_LOB.SUBSTR) и получих
+000000000 00:00:00.013578900 (VARCHAR2)
+000000000 00:00:00.964527400 (CLOB SUBSTR)
+000000000 00:00:00.011416800 (DBMS_LOB.SUBSTR)
Накрая промених диапазона на 25,14 (14,25 за DBMS_LOB.SUBSTR) и получих
+000000000 00:00:00.011210200 (VARCHAR2)
+000000000 00:00:00.916439800 (CLOB SUBSTR)
+000000000 00:00:00.013781300 (DBMS_LOB.SUBSTR)
Моето заключение е, че когато се работи срещу CLOB, най-добре е да се използва DBMS_LOB.SUBSTR, тъй като изглежда, че на практика няма намаление на производителността в сравнение с използването на SUBSTR срещу "нормален" VARCHAR2. SUBSTR срещу CLOB изглежда страда от значително намаление на производителността. За протокола - OS =HP/UX (Unix вариант), Oracle версия=11.1, процесор=HP Itanium 2-plex. YMMV.
Споделете и се насладете.
И тъй като ако си струва да се направи, си струва да се прекалява, ето още няколко резултата с низовете, разширени до 32767 знака. Диапазони на поднизове, дадени с всеки набор от резултати:
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)
Същият ден, същото заключение.
Cthulhu fhtagn.
(Още веднъж за пробив, скъпи приятели, още веднъж...)
Стартирайте отново бенчмарковете, променяйки размера на CLOB на 3276700 и вземайки подниза от средата, започвайки от 2475000 за дължина 25000, получавам:
+000000000 00:00:00.176883200 (VARCHAR2)
+000000000 00:00:02.069482600 (CLOB SUBSTR)
+000000000 00:00:00.175341500 (DBMS_LOB.SUBSTR)
(Обърнете внимание, че промените засягат само последните два теста).
И...същите резултати, различен ден.
YMMV.