Anda di halaman 1dari 23

Variveis Bind

Uso de variveis bind:


Desempenho e Escalabilidade em
Aplicativos Oracle

Tpicos:

Arquitetura Oracle
Parse (Soft x Hard)
O que varivel bind?
Por que usar? Regra ou Realidade?
Desempenho e Escalabilidade
Exemplos e Resultados

Tpicos:

Arquitetura Oracle
Parse (Soft x Hard)
O que varivel bind?
Por que usar? Regra ou Realidade?
Desempenho e Escalabilidade
Exemplos e Resultados

Arquitetura Oracle

Library Cache (Shared


Pool)
1.
2.
3.

Texto de comandos SQL (hash)


Plano de execuo
Cdigo PL/SQL compilado

LRU
Latch (serial)

Tpicos:

Arquitetura Oracle
Parse (Soft x Hard)
O que varivel bind?
Por que usar? Regra ou Realidade?
Desempenho e Escalabilidade
Exemplos e Resultados

Fases de um SQL
Parse:

Sintaxe
Nomes de Objetos
Privilgios
Plano de Execuo
Alocao de memria library cache

Execute:
Acesso aos dados (plano de execuo)
Locks na linhas envolvidas (update ou delete)

Fetch:
Processo servidor recebe o resultado (select)

Soft Parse x Hard Parse


Hard Parse:
Comando Novim
Todas etapas envolvidas
Consumo de CPU infinito
Soft Parse:
Comando Jtl
S verifica privilgio

Tpicos:

Arquitetura Oracle
Parse (Soft x Hard)
O que varivel bind?
Por que usar? Regra ou Realidade?
Desempenho e Escalabilidade
Exemplos e Resultados

O que varivel bind ?


Consulta sem bind:
select * from emp
where empno = 7900;

Consulta com bind:


select * from emp
where empno = :x;

Exemplo - Visibilidade
Listagem L03_20 Declarao de varivel
SQL> VARIABLE MSG VARCHAR2(200) - - Varivel bind
SQL> DECLARE
2 WNUM
NUMBER
:= 12;
3 WCHAR
VARCHAR2(20) := 'WCHAR EXTERNA';
4 WUNICO
NUMBER
:= 5;
5 BEGIN
6 DECLARE
7 WNUM
NUMBER
:= 10;
8 WCHAR
VARCHAR2(20) := 'WCHAR INTERNA';
9 WTOTAL
NUMBER;
10 BEGIN
11 WTOTAL := WNUM + WUNICO;
12 :MSG := WCHAR||'-'||WTOTAL;
13 END;
14 END;
15 /
Procedimento PL/SQL concludo com sucesso.

SQL> PRINT MSG


MSG
-----------------------------WCHAR INTERNA-15

PL/SQL - 11

Exemplos - Visibilidade
Na listagem L03_21 a seguir, fizemos referncia varivel wtotal no bloco principal e
recebemos um erro indicando que neste bloco no havia sido declarada nenhuma
varivel wtotal. Esta varivel deixou de existir quando passamos pelo End ou subbloco.
Listagem L03_21 Declarao de varivel
SQL> DECLARE
2 WNUM
NUMBER := 12;
3 WCHAR
VARCHAR2(20) := 'WCHAR EXTERNA';
4 WUNICO
NUMBER
:= 5;
WTOTAL := WTOTAL + 1;
5 BEGIN
*
6 DECLARE
ERRO na linha 14:
7 WNUM
NUMBER
:= 10;
8 WCHAR
VARCHAR2(20) := 'WCHAR INTERNA';
ORA-06550: linha 14, coluna 3:
9 WTOTAL
NUMBER;
PLS-00201: o identificador 'WTOTAL'
10 BEGIN
deve ser declarado
11 WTOTAL := WNUM + WUNICO;
ORA-06550: linha 14, coluna 3:
12 :MSG := WCHAR||'-'||WTOTAL;
PL/SQL: Statement ignored
13 END; - - Acaba o escopo da varivel WTOTAL
14 WTOTAL := WTOTAL + 1;
15 END;
PL/SQL - 12
16 /

Exemplo 1
(desempenho)
ops$o_melao@OMELAO.CPQD> declare
2
type rc is ref cursor;
3
l_rc rc;
4
l_dummy all_objects.object_name%type;
5
l_start number default dbms_utility.get_time;
6 begin
7
for i in 1 .. 1000
8
loop
9
open l_rc for
10
'select object_name
11
from all_objects
12
where object_id = ' || i;
13
fetch l_rc into l_dummy;
14
close l_rc;
15
end loop;
16
dbms_output.put_line
17
( round( (dbms_utility.get_time-l_start)/100, 2 ) ||
18
' seconds...' );
19 end;
20 /
26.19 seconds...
PL/SQL procedure successfully completed.

Exemplo 2
(desempenho)
ops$o_melao@OMELAO.CPQD> declare
2
type rc is ref cursor;
3
l_rc rc;
4
l_dummy all_objects.object_name%type;
5
l_start number default dbms_utility.get_time;
6 begin
7
for i in 1 .. 1000
8
loop
9
open l_rc for
10
'select object_name
11
from all_objects
12
where object_id = :x'
13
using i;
14
fetch l_rc into l_dummy;
15
close l_rc;
16
end loop;
17
dbms_output.put_line
18
( round( (dbms_utility.get_time-l_start)/100, 2 ) ||
19
' seconds...' );
20 end;
21 /
3.16 seconds...
PL/SQL procedure successfully completed.

Tpicos:

Arquitetura Oracle
Parse (Soft x Hard)
O que varivel bind?
Por que usar? Regra ou Realidade?
Desempenho e Escalabilidade
Exemplos e Resultados

Por que usar bind ?


(desempenho)
Shared pool ou Selfish pool?
Cache = overhead
CPU/Recursos desperdiados:
Fazendo parse
Gerenciando objetos

Exemplo 3
(escalabilidade)
declare
l_number number;
begin
for i in 1 .. 10000
loop
l_number := dbms_random.random;
execute immediate
'insert into t values ( ' || l_number
l_number
l_number
l_number
end loop;
commit;
end;
/

||
||
||
||

',' ||
',' ||
',' ||
')';

Resultados (sem bind !)


1

Waits

102

267

385

Tempo
(sec.)

1.56

5.92

10.72

5
542
16.67

Exemplo 4
(escalabilidade)
declare
l_number number;
begin
for i in 1 .. 10000
loop
l_number := dbms_random.random;
execute immediate
'insert into t values ( :x1, :x2, :x3, :x4 )'
using l_number, l_number, l_number, l_number;
end loop;
commit;
end;
/

Resultados (com bind !)


1

Waits

47

65

89

113

Tempo
(sec.)
%

0.74
(47)

1.29
(21)

2.12
(19)

3.0
(17)

Mgica???
Com 5 usurios tempo parado cai de
83 segundos para 15!!!

Por que usar bind ?


(escalabilidade)
Latch (hp) conteno CPU
comando retirados CPU conteno
lentido gasto de recursos
conteno CPU Latch (hp)
lentido

Uso ou no uso?
Exemplo 1:
select * from cable
where status IN (3,5);

Exemplo 2:
select * from cable
where cable_id = 3595;

Exemplo 3:
select * from times_futebol
where melhor_time_do_mundo = Fluminense;

Concluso
Variveis bind = menos tempo de CPU,
menos recursos de mquina, menos
conteno,
mais
desempenho,
mais
escalabilidade, mais alegria!
Viva mais feliz, use bind voc tambm!

Anda mungkin juga menyukai