(Mentiras, droga mentiras e benchmarks...)
Executei novamente seu teste 10 vezes, expandindo a string para que ela tivesse 30 caracteres completos e obtive os seguintes resultados médios:
+000000000 00:00:00.011694200 (VARCHAR2)
+000000000 00:00:00.901000600 (CLOB SUBSTR)
+000000000 00:00:00.013169200 (DBMS_LOB.SUBSTR)
Em seguida, alterei o intervalo de substring para 5,14 (14,5 para DBMS_LOB.SUBSTR) e obtive:
+000000000 00:00:00.011731000 (VARCHAR2)
+000000000 00:00:01.010840000 (CLOB SUBSTR)
+000000000 00:00:00.011427000 (DBMS_LOB.SUBSTR)
Mudei então o intervalo para 17,14 (14,17 para DBMS_LOB.SUBSTR) e obtive
+000000000 00:00:00.013578900 (VARCHAR2)
+000000000 00:00:00.964527400 (CLOB SUBSTR)
+000000000 00:00:00.011416800 (DBMS_LOB.SUBSTR)
Por fim, alterei o intervalo para 25,14 (14,25 para DBMS_LOB.SUBSTR) e obtive
+000000000 00:00:00.011210200 (VARCHAR2)
+000000000 00:00:00.916439800 (CLOB SUBSTR)
+000000000 00:00:00.013781300 (DBMS_LOB.SUBSTR)
Minha conclusão é que ao trabalhar contra CLOBs é melhor usar DBMS_LOB.SUBSTR, pois parece não ter efetivamente nenhuma penalidade de desempenho em comparação com o uso de SUBSTR contra um VARCHAR2 "normal". SUBSTR contra um CLOB parece sofrer uma penalidade de desempenho significativa. Para registro - SO =HP/UX (variante Unix), versão Oracle=11.1, processador=HP Itanium 2-plex. YMMV.
Compartilhe e curta.
E porque se vale a pena fazer vale a pena fazer demais, aqui estão mais alguns resultados com as strings expandidas para 32767 caracteres. Intervalos de substring fornecidos com cada conjunto de resultados:
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)
Mesmo dia, mesma conclusão.
Cthulhu fhtagn.
(Mais uma vez até a brecha, queridos amigos, mais uma vez...)
Executei novamente os benchmarks, alterando o tamanho do CLOB para 3276700 e pegando a substring do meio começando em 2475000 para o comprimento 25000, obtenho:
+000000000 00:00:00.176883200 (VARCHAR2)
+000000000 00:00:02.069482600 (CLOB SUBSTR)
+000000000 00:00:00.175341500 (DBMS_LOB.SUBSTR)
(Observe que as alterações afetam apenas os dois últimos testes).
E... mesmos resultados, dias diferentes.
YMMV.