(うそ、くそー 嘘、そしてベンチマーク...)
テストを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(DBMS_LOB.SUBSTRの場合は14,5)に変更し、次のようになりました。
+000000000 00:00:00.011731000 (VARCHAR2)
+000000000 00:00:01.010840000 (CLOB SUBSTR)
+000000000 00:00:00.011427000 (DBMS_LOB.SUBSTR)
次に、範囲を17,14(DBMS_LOB.SUBSTRの場合は14,17)に変更し、取得しました
+000000000 00:00:00.013578900 (VARCHAR2)
+000000000 00:00:00.964527400 (CLOB SUBSTR)
+000000000 00:00:00.011416800 (DBMS_LOB.SUBSTR)
最後に、範囲を25,14(DBMS_LOB.SUBSTRの場合は14,25)に変更し、取得しました
+000000000 00:00:00.011210200 (VARCHAR2)
+000000000 00:00:00.916439800 (CLOB SUBSTR)
+000000000 00:00:00.013781300 (DBMS_LOB.SUBSTR)
私の結論は、CLOBに対して作業する場合は、「通常の」VARCHAR2に対してSUBSTRを使用する場合と比較して、パフォーマンスの低下が事実上ないように見えるため、DBMS_LOB.SUBSTRを使用するのが最善であるということです。 CLOBに対するSUBSTRは、パフォーマンスが大幅に低下するようです。記録のために-OS=HP / UX(Unixバリアント)、Oracleバージョン=11.1、プロセッサ=HPItanium2-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)
同じ日、同じ結論。
クトゥルフ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)
(変更は最後の2つのテストにのみ影響することに注意してください)。
そして...同じ結果、異なる日。
YMMV。