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
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)
Tpicos:
Arquitetura Oracle
Parse (Soft x Hard)
O que varivel bind?
Por que usar? Regra ou Realidade?
Desempenho e Escalabilidade
Exemplos e Resultados
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.
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
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;
/
||
||
||
||
',' ||
',' ||
',' ||
')';
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;
/
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!!!
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!