(Lži, sakra lži a benchmarky...)
Zopakoval jsem váš test 10krát, rozšířil jsem řetězec tak, aby měl celých 30 znaků, a získal jsem následující průměrné výsledky:
+000000000 00:00:00.011694200 (VARCHAR2)+000000000 00:00:00.901000600 (CLOB SUBSTR)+000000000 (00:0000000 00:00:0000 00:00:00000 00:00:00000 00:00:00000 00:031690.0)D_code>DSTR.
Pak jsem změnil rozsah podřetězců na 5,14 (14,5 pro DBMS_LOB.SUBSTR) a dostal jsem:
+000000000 00:00:00.011731000 (VARCHAR2)+000000000 00:00:01.010840000 (CLOB SUBSTR)+000000000 (00:0000000 00:0000000 00:00:270.0) SUBcode>DLOMS 00:00:270.0
Pak jsem změnil rozsah na 17,14 (14,17 pro DBMS_LOB.SUBSTR) a mám
+000000000 00:00:00.013578900 (VARCHAR2)+000000000 00:00:00.964527400 (CLOB SUBSTR)+000000000 (00:0000000 00:00:00000 00:00:00000 00:00:00000 00:00000000 00:00:000.0) SUBcode>00:014160.0
Nakonec jsem změnil rozsah na 25,14 (14,25 pro DBMS_LOB.SUBSTR) a dostal
+000000000 00:00:00.011210200 (VARCHAR2)+000000000 00:00:00.916439800 (CLOB SUBSTR)+000000000 (00:0000000 00:00:0000 00:0000000 00:00:0000 00:00:0000 00:0000000 00:0000000 00:00:000.0.0D
Můj závěr je, že když pracujete proti CLOB's, je nejlepší použít DBMS_LOB.SUBSTR, protože se zdá, že ve srovnání s použitím SUBSTR proti "normálnímu" VARCHAR2 nemá žádnou výkonnostní penalizaci. Zdá se, že SUBSTR proti CLOB trpí značnou výkonnostní penalizací. Pro pořádek - OS =HP/UX (varianta Unix), verze Oracle=11.1, procesor=HP Itanium 2-plex. YMMV.
Sdílejte a užívejte si.
A protože pokud to stojí za to udělat, stojí za to to přehánět, zde jsou některé další výsledky s řetězci rozšířenými na 32767 znaků. Rozsahy podřetězců uvedené u každé sady výsledků:
1, 25000+000000000 00:00:00.198466400 (Varchar2) +000000 000 00:00:02,870958700 (CLOB substr) +0000000 00:00:00.174490100 (DBMS_LOB.SUBSTR) 1000, 25000+ :00.253447900 (Varchar2) +000000000 00:00:02.491790500 (CLOB substr) +0000000 00:00:00.193560100 (DBMS_LOB.SUBSTR) 10000, 25000+00 0000:0000:00002 000 (VARITHR2) +00:2) +00:2) 0000:00:217812 000 (DBMS_LOB.SUBSTR) 10000:00:00:00:00:00:00:00:SUBSTR)+000000000 00:00:00.222200200 (DBMS_LOB.SUBSTR)
Stejný den, stejný závěr.
Cthulhu fhtagn.
(Ještě jednou k porušení, drazí přátelé, ještě jednou...)
Znovu spusťte benchmarky, změňte velikost CLOB na 3276700 a vezměte podřetězec od středu počínaje 2475000 pro délku 25000, což dostávám:
+000000000 00:00:00,176883200 (VARCHAR2)+000000000 00:00:02.069482600 (CLOB SUBSTR)+000000000 (00:0000000 00:00000000 00:00000000 00:00000000 00:00000000 00:00000000 00:00000000 00:00000000 00:00000000 00:00:03410.1.
(Všimněte si, že změny ovlivní pouze poslední dva testy).
A...stejné výsledky, jiný den.
YMMV.