Reprinted with Permission by Quest Software Feb. 2007


Code Listing 3: Script to compare VARCHAR2 and CLOB performance
CONNECT sys/p@10gR2_Linux AS SYSDBA
drop user Usr cascade
/
grant Create Session, Resource to Usr identified by p
/
CONNECT Usr/p@10gR2_Linux
----------------------------------------------------------------------
create or replace procedure p1 is


  $if $$Big_String_Is_Clob $then
    subtype Big_String is clob;
    Caption constant varchar2(20) := 'clob version';
  $else
    subtype Big_String is varchar2(32767);
    Caption constant varchar2(20) := 'varchar2 version';
  $end


  x                   Big_String;
  s                   Big_String;
  Expected_s constant Big_String := '+            257';
  t0 integer; t1 integer;
begin
  t0 := DBMS_Utility.Get_Cpu_Time();


  for j in 1..2047 loop
    x := x||'+'||Lpad(j,15);
  end loop;
  if Length(x) <> 32752 then raise Program_Error; end if;
  s := Substr(x,4097,16);
  if s <> Expected_s then raise Program_Error; end if;


  t1 := DBMS_Utility.Get_Cpu_Time();
  DBMS_Output.Put_Line (Caption||': '||To_Char(t1-t0));
end;
/


create or replace procedure p2 is


  $if $$Big_String_Is_Clob $then
    subtype Big_String is clob;
    Caption constant varchar2(20) := 'clob version';
  $else
    subtype Big_String is varchar2(32767);
    Caption constant varchar2(20) := 'varchar2 version';
  $end


  Len                 constant pls_integer := 16;
  Lim                 constant pls_integer := 2047;
  x                   Big_String;
  s                   Big_String;
  type Big_Strings    is table of Big_String index by pls_integer;
  function Populate_Expected return Big_Strings;


  Expected_Substrings constant Big_Strings := Populate_Expected();


  t0 integer; t1 integer;


  function Populate_Expected return Big_Strings is
    a Big_Strings;
  begin
    for j in 1..Lim loop
      a(j) := '+'||Lpad(j,Len-1);
    end loop;
    return a;
  end Populate_Expected;


begin
  for j in 1..Lim loop
    x := x||'+'||Lpad(j,Len-1);
  end loop;
  t0 := DBMS_Utility.Get_Cpu_Time();


  if Length(x) <> 32752 then raise Program_Error; end if;
  for j in 0..Lim-1 loop
    s := Substr(x,(j*Len)+1,Len);
    if s <> Expected_Substrings(j+1) then raise Program_Error; end if;
  end loop;


  t1 := DBMS_Utility.Get_Cpu_Time();
  DBMS_Output.Put_Line (Caption||': '||To_Char(t1-t0));
end p2;
/
----------------------------------------------------------------------
-- clob version: 62
-- varchar2 version:  0


alter procedure p1 compile plsql_ccflags = 'Big_String_Is_Clob:true' reuse settings
/
begin p1(); end;
/
alter procedure p1 compile plsql_ccflags = 'Big_String_Is_Clob:false' reuse settings
/
begin p1(); end;
/


----------------------------------------------------------------------
-- clob version: 60
-- varchar2 version: 0


alter procedure p2 compile plsql_ccflags = 'Big_String_Is_Clob:true' reuse settings
/
begin p2(); end;
/
alter procedure p2 compile plsql_ccflags = 'Big_String_Is_Clob:false' reuse settings
/
begin p2(); end;
/