(Bohong, sialan kebohongan, dan tolok ukur...)
Saya menjalankan ulang pengujian Anda 10 kali, memperluas string sehingga menjadi 30 karakter penuh, dan mendapatkan hasil rata-rata berikut:
+000000000 00:00:00.011694200 (VARCHAR2)
+000000000 00:00:00.901000600 (CLOB SUBSTR)
+000000000 00:00:00.013169200 (DBMS_LOB.SUBSTR)
Saya kemudian mengubah rentang substring menjadi 5,14 (14,5 untuk DBMS_LOB.SUBSTR) dan mendapatkan:
+000000000 00:00:00.011731000 (VARCHAR2)
+000000000 00:00:01.010840000 (CLOB SUBSTR)
+000000000 00:00:00.011427000 (DBMS_LOB.SUBSTR)
Saya kemudian mengubah rentang menjadi 17,14 (14,17 untuk DBMS_LOB.SUBSTR) dan mendapatkan
+000000000 00:00:00.013578900 (VARCHAR2)
+000000000 00:00:00.964527400 (CLOB SUBSTR)
+000000000 00:00:00.011416800 (DBMS_LOB.SUBSTR)
Akhirnya, saya mengubah rentang menjadi 25,14 (14,25 untuk DBMS_LOB.SUBSTR) dan mendapatkan
+000000000 00:00:00.011210200 (VARCHAR2)
+000000000 00:00:00.916439800 (CLOB SUBSTR)
+000000000 00:00:00.013781300 (DBMS_LOB.SUBSTR)
Kesimpulan saya adalah bahwa ketika bekerja melawan CLOB, yang terbaik adalah menggunakan DBMS_LOB.SUBSTR karena tampaknya tidak memiliki penalti kinerja secara efektif dibandingkan dengan menggunakan SUBSTR terhadap VARCHAR2 "normal". SUBSTR terhadap CLOB tampaknya menderita penalti kinerja yang signifikan. Sebagai catatan - OS =HP/UX (varian Unix), Oracle versi=11.1, prosesor=HP Itanium 2-plex. YMMV.
Bagikan dan nikmati.
Dan karena jika itu layak dilakukan, itu layak dilakukan secara berlebihan, inilah beberapa hasil lagi dengan string yang diperluas menjadi 32767 karakter. Rentang substring yang diberikan dengan setiap rangkaian hasil:
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)
Hari yang sama, kesimpulan yang sama.
Cthulhu fhtagn.
(Sekali lagi untuk pelanggaran, teman-teman, sekali lagi...)
Jalankan kembali tolok ukur, ubah ukuran CLOB menjadi 3276700, dan ambil substring dari tengah mulai dari 2475000 untuk panjang 25000 yang saya dapatkan:
+000000000 00:00:00.176883200 (VARCHAR2)
+000000000 00:00:02.069482600 (CLOB SUBSTR)
+000000000 00:00:00.175341500 (DBMS_LOB.SUBSTR)
(Perhatikan bahwa perubahan hanya memengaruhi dua pengujian terakhir).
DAN...hasil yang sama, hari yang berbeda.
YMMV.