Literals, Substitution Variables and Bind Variables
The article compares the affect of using literals, substitution variables and bind variables on memory and CPU usage.
oracle miscconfigurationintermediate
by OracleDba
14 views
The article compares the affect of using literals, substitution variables and bind variables on memory and CPU usage.
12345678910111213141516171819202122
alter system flush shared_pool;
select * from dual where dummy = 'LITERAL1';
select * from dual where dummy = 'LITERAL2';
column sql_text format a60
select sql_text,
executions
from v$sqlarea
where instr(sql_text, 'select * from dual where dummy') > 0
and instr(sql_text, 'sql_text') = 0
order by sql_text;
SQL_TEXT EXECUTIONS
------------------------------------------------------------ ----------
select * from dual where dummy = 'LITERAL1' 1
select * from dual where dummy = 'LITERAL2' 1
2 rows selected.
SQL>1234567891011121314151617181920212223242526272829303132333435363738394041
SQL> alter system flush shared_pool;
System altered.
SQL> select * from dual where dummy = '&dummy';
Enter value for dummy: SUBSTITUTION_VARIABLE1
old 1: select * from dual where dummy = '&dummy'
new 1: select * from dual where dummy = 'SUBSTITUTION_VARIABLE1'
no rows selected
SQL> select * from dual where dummy = '&dummy';
Enter value for dummy: SUBSTITUTION_VARIABLE2
old 1: select * from dual where dummy = '&dummy'
new 1: select * from dual where dummy = 'SUBSTITUTION_VARIABLE2'
no rows selected
SQL>
column sql_text format a60
select sql_text,
executions
from v$sqlarea
where instr(sql_text, 'select * from dual where dummy') > 0
and instr(sql_text, 'sql_text') = 0
order by sql_text;
SQL_TEXT EXECUTIONS
------------------------------------------------------------ ----------
select * from dual where dummy = 'SUBSTITUTION_VARIABLE1' 1
select * from dual where dummy = 'SUBSTITUTION_VARIABLE2' 1
2 rows selected.
SQL>
select * from dual where dummy = '&1';
SQL> @dummy MyValue1234567891011121314151617181920212223242526
alter system flush shared_pool;
variable dummy varchar2(30);
exec :dummy := 'BIND_VARIABLE1';
select * from dual where dummy = :dummy;
exec :dummy := 'BIND_VARIABLE2';
select * from dual where dummy = :dummy;
column sql_text format a60
select sql_text,
executions
from v$sqlarea
where instr(sql_text, 'select * from dual where dummy') > 0
and instr(sql_text, 'sql_text') = 0
order by sql_text;
SQL_TEXT EXECUTIONS
------------------------------------------------------------ ----------
select * from dual where dummy = :dummy 2
1 row selected.
SQL>123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
conn sys/password as sysdba
alter system flush shared_pool;
conn sys/password as sysdba
declare
l_dummy dual.dummy%type;
begin
for i in 1 .. 10 loop
begin
execute immediate 'select dummy from dual where dummy = ''' || to_char(i) || ''''
into l_dummy;
exception
when no_data_found then
null;
end;
end loop;
end;
/
PL/SQL procedure successfully completed.
SQL>
select sn.name, ms.value
from v$mystat ms, v$statname sn
where ms.statistic# = sn.statistic#
and sn.name = 'parse time cpu';
NAME VALUE
---------------------------------------------------------------- ----------
parse time cpu 63
1 row selected.
SQL>
column sql_text format a60
select sql_text,
executions
from v$sqlarea
where instr(sql_text, 'select dummy from dual where dummy') > 0
and instr(sql_text, 'sql_text') = 0
and instr(sql_text, 'declare') = 0
order by sql_text;
SQL_TEXT EXECUTIONS
------------------------------------------------------------ ----------
select dummy from dual where dummy = '1' 1
select dummy from dual where dummy = '10' 1
select dummy from dual where dummy = '2' 1
select dummy from dual where dummy = '3' 1
select dummy from dual where dummy = '4' 1
select dummy from dual where dummy = '5' 1
select dummy from dual where dummy = '6' 1
select dummy from dual where dummy = '7' 1
select dummy from dual where dummy = '8' 1
select dummy from dual where dummy = '9' 1
10 rows selected.
SQL>
conn sys/password as sysdba
alter system flush shared_pool;
conn sys/password as sysdba
declare
l_dummy dual.dummy%type;
begin
for i in 1 .. 10 loop
begin
execute immediate 'select dummy from dual where dummy = to_char(:dummy)'
into l_dummy using i;
exception
when no_data_found then
null;
end;
end loop;
end;
/
PL/SQL procedure successfully completed.
SQL>
select sn.name, ms.value
from v$mystat ms, v$statname sn
where ms.statistic# = sn.statistic#
and sn.name = 'parse time cpu';
NAME VALUE
---------------------------------------------------------------- ----------
parse time cpu 40
1 row selected.
SQL>
column sql_text format a60
select sql_text,
executions
from v$sqlarea
where instr(sql_text, 'select dummy from dual where dummy') > 0
and instr(sql_text, 'sql_text') = 0
and instr(sql_text, 'declare') = 0
order by sql_text;
SQL_TEXT EXECUTIONS
------------------------------------------------------------ ----------
select dummy from dual where dummy = to_char(:dummy) 10
1 row selected.
SQL>Please to add comments
No comments yet. Be the first to comment!