Anda di halaman 1dari 6

Pedro F.

Carvalho
Analista de Sistemas
contato@pedrofcarvalho.com.br

Ajustando o BUFFER CACHE, SHARED POOL e o LOG BUFFER


BUFFER CACHE
O buffer cache utilizado para armazenar os blocos lidos a partir dos discos. Significa
que um buffer cache pequeno ir fazer com que o Oracle precise remover do cache os
blocos de dados seguindo a lista LRU (LAST RECENTLY USED), e dependendo da
frequncia com que isso acontece, poder gerar uma queda na performance.
No existe uma mgica para dimensionar o buffer cache, o que normalmente se faz
estimar um tamanho inicial e monitorar o acerto, caso no esteja dentro do ideal, voc
precisar aumentar e repetir o ciclo de monitoramento.
Um detalhe importante que quando a instncia inicializada, o buffer cache est
vazio, portanto, qualquer consulta ir gerar misses no buffer. Significa dizer que
validar as taxas de acerto no buffer logo aps o startup errado, voc
provavelmente ter uma taxa de acerto muito baixa.
O buffer calculado usando a seguinte frmula:
1 - (physical_reads/(db_block_gets consistent_gets))
consistent gets o nmero de vezes que uma leitura consistente foi requisitada para
um bloco do buffer cache.
db block gets from o nmero de vezes que um bloco foi requisitado para o buffer
cache.
physical reads o nmero total de blocos de dados lidos do disco para o buffer
cache.
SELECT NAME, PHYSICAL_READS, DB_BLOCK_GETS, CONSISTENT_GETS,
1 - (PHYSICAL_READS / (DB_BLOCK_GETS CONSISTENT_GETS)) "Hit Ratio"
FROM VBUFFER_POOL_STATISTICS;
NAME
PHYSICAL_READS DB_BLOCK_GETS CONSISTENT_GETS Hit Ratio
--------------- -------------- ------------- --------------- ---------DEFAULT
2382927
85639921
46004325 .981898738
1 row selected.
No exemplo acima, a taxa de acerto foi de 98 no buffer cache.
Uma consulta semelhante pode ser feita na VSYSSTAT:
SELECT NAME, VALUE
FROM VSYSSTAT
WHERE NAME IN ('db block gets from cache',

Pedro F. Carvalho
Analista de Sistemas
contato@pedrofcarvalho.com.br

'consistent gets from cache',


'physical reads cache');
NAME
VALUE
---------------------------------------------- ---------db block gets from cache
88204118
consistent gets from cache
9726193722
physical reads cache
2560965
3 rows selected.
1 - (2560965/(882041189726193722)) = 0,99973906
O buffer cache tambm pode ser ajustado com base na view VDB_CACHE_ADVICE.
Para que essa view seja populada necessrio que o parmetro DB_CACHE_ADVICE
esteja ON.
show parameter db_cache_advice
db_cache_advice
string

ON

A declarao abaixo consulta a respectiva view, retornando estimativas de buffer e de


acerto.
COLUMN
COLUMN
COLUMN
COLUMN

size_for_estimate FORMAT 999,999,999,999 heading 'Cache Size (MB)'


buffers_for_estimate FORMAT 999,999,999 heading 'Buffers'
estd_physical_read_factor FORMAT 999.90 heading 'Estd PhysRead Factor'
estd_physical_reads FORMAT 999,999,999 heading 'Estd Phys Reads'

SELECT size_for_estimate, buffers_for_estimate,


estd_physical_read_factor, estd_physical_reads
FROM VDB_CACHE_ADVICE
WHERE name = 'DEFAULT'
AND block_size = (SELECT value
FROM VPARAMETER
WHERE name = 'db_block_size')
AND advice_status = 'ON';
Estd Phys Estd Phys
Cache Size (MB)
Buffers Read Factor
Reads
---------------- ------------ ----------- -----------80
9,915
61.70 150,251,109
160
19,830
40.30 98,140,104
240
29,745
21.08 51,329,557
320
39,660
7.23 17,594,710
400
49,575
1.36 3,309,722
480
59,490
1.21 2,948,364
560
69,405
1.13 2,763,717
640
79,320
1.09 2,655,866
720
89,235
1.06 2,581,271

Pedro F. Carvalho
Analista de Sistemas
contato@pedrofcarvalho.com.br

800
880
960
1,040
1,120
1,200
1,280
1,360
1,440
1,520
1,600

99,150
109,065
118,980
128,895
138,810
148,725
158,640
168,555
178,470
188,385
198,300

1.03
1.00
.98
.97
.95
.93
.92
.92
.91
.90
.89

2,510,199
2,435,219
2,380,060
2,350,269
2,309,334
2,275,624
2,249,930
2,231,580
2,211,413
2,193,922
2,167,724

20 rows selected.
A anlise dela feita de forma diferente a de taxas. A consulta mostra uma reduo de
2(0.98) no nmero de leitura fsicas caso o buffer cache seja configurado para 960MB.
Lembrando que, quando falamos de memria, estamos falando de memria fsica, um
servidor Oracle, no deve fazer swap.
Para utilizar o buffer cache de forma eficiente, as declaraes SQL da aplicao devem
estar ajustadas para evitar consumo desnecessrio de recursos. Isso feito verificando
as declaraes SQL executadas com mais freqncia e as que fazem uso de uma maior
quantidade de buffers.
A consulta abaixo retorna as 50 maiores consultas consumidoras de BUFFERS.
SELECT *
FROM (SELECT SQL_FULLTEXT, BUFFER_GETS
FROM VSQL
ORDER BY BUFFER_GETS DESC)
WHERE ROWNUM <= 50
Existem duas formas de melhorar o acerto no buffer:

Otimizando as consultas de forma a retornarem menos blocos, e dessa forma


utilizar menos buffer.
Aumentando o buffer cache.

SHARED POOL
O Oracle utilize a SHARED POOL para armazenar declaraes PL/SQL e SQL, dados do
dicionrio entre outros.
Da mesma forma que o BUFFER CACHE, impossvel determinar um tamanho inicial
para uma base nova. Voc deve seguir o mesmo principio do BUFFER CACHE, colocar
um valor e avaliar o ambiente. Lembrando que a SHARED POOL inicia vazia, e
medida que os usurios vo submetendo as declaraes SQL ela vai sendo preenchida.

Pedro F. Carvalho
Analista de Sistemas
contato@pedrofcarvalho.com.br

Para isso, observe o seguinte:

Utilize sempre que possvel bind variables ao invs de caracteres literais nas
declaraes. Isso faz com que o Oracle armazene apenas uma declarao SQL.
As declaraes, apesar de semelhantes, ocupam duas reas distintas na
SHARED_POOL:

Substitua:
SELECT employee_id FROM employees WHERE department_id = 10;
SELECT employee_id FROM employees WHERE department_id = 20;
Por:
SELECT employee_id FROM employees WHERE department_id = :dept_id;

As aplicaes devem evitar os usurios possam criar suas prprias instrues.

Crie padres para as bind variables e para os espaos nas declaraes SQL
blocos de PL/SQL.

Por exemplo:
SELECT employee_id FROM employees WHERE department_id = :dept_id
diferente de:
SELECT employee_id FROM employees where department_id = :dept_id
O objetivo do tuning na SHARED_POOL fazer com que uma declarao SQL que est
no cache possa ser reutilizada o maior nmero de vezes possvel.
Utilize a declarao abaixo para identificar a taxa de hit ratio da shared pool:
SELECT sum(pinhits) / sum(pins)
FROM VLIBRARYCACHE;
SUM(PINHITS)/SUM(PINS)
---------------------.996986356
1 row selected.
A consulta mostrou que 99,69 dos cdigos de SQL e PLSQL esto sendo
reaproveitados.
A declarao abaixo mostra a quantidade de bytes livres na SHARED_POOL.

Pedro F. Carvalho
Analista de Sistemas
contato@pedrofcarvalho.com.br

SELECT * FROM VSGASTAT


WHERE NAME = 'free memory'
AND POOL = 'shared pool';
POOL
NAME
BYTES
----------- ------------------------- --------shared pool free memory
385236520
1 row selected.
A consulta abaixo tambm auxilia na descoberta da taxa de acerto da SHARED POOL.
SELECT (SUM(GETS - GETMISSES - FIXED)) / SUM(GETS) "ROW CACHE"
FROM VROWCACHE;
ROW CACHE
---------.994562437
1 row selected.
Tambm possvel utilizar a view VSHARED_POOL_ADVICE. Para isso preciso que o
parmetro STATISTICS_LEVEL esteja configurado como ALL ou TYPICAL.
show parameter statistics_level;
statistics_level
string TYPICAL
SELECT shared_pool_size_for_estimate "Size of Shared Pool in MB",
shared_pool_size_factor "Size Factor",
estd_lc_time_saved "Time Saved in sec"
FROM vshared_pool_advice;
Size of Shared Pool in MB Size Factor Time Saved in sec
------------------------- ----------- ----------------352
.2391
1461671
512
.3478
1465054
672
.4565
1470451
832
.5652
1472452
992
.6739
1472513
1152
.7826
1472536
1312
.8913
1472542
1472
1
1472542
1632
1.1087
1472542
1792
1.2174
1472542
1952
1.3261
1472542
2112
1.4348
1472542
2272
1.5435
1472542
2432
1.6522
1472542
2592
1.7609
1472542
2752
1.8696
1472542

Pedro F. Carvalho
Analista de Sistemas
contato@pedrofcarvalho.com.br

2912
3072

1.9783
2.087

1472542
1472542

18 rows selected.
A sada acima mostra que o tamanho da shared pool de 1472M. Mostra tambm que,
se o tamanho da shared pool fosse ajustado para 3072M, teria a mesma eficincia.
LOG BUFFER
Aplicaes que inserem, modificam ou excluem um grande volume de registros
normalmente no utilizam o tamanho default de log buffer. Apesar do tamanho do log
buffer ser bem menor frente ao tamanho total da SGA, ele tem grande impacto na
performace de sistemas que realizam atualizao no volume dos dados.
Um tamanho inicial para o log buffer :
MAX(0.5M, (128K * nmero de CPUs))
A maioria dos sistemas que possuem log buffer maior que 1M no possuem ganhos de
performance.
A anlise da performance do log buffer feita por intervalo. Deve ser coletado em
intervalos, e verificar se existe um aumento do valor. O ideal que no existam
alteraes.
SELECT NAME, VALUE
FROM VSYSSTAT
WHERE NAME = 'redo buffer allocation retries';
NAME
VALUE
----------------------------------------------------------- ---------redo buffer allocation retries
11
1 row selected.
Se o valor aumentar de forma consistente, necessrio ajustar o tamanho do log
buffer

Anda mungkin juga menyukai