Pinned Buffer – A dúvida

Enquanto estudava para um certificação do Oracle, deparei-me com uma pergunta a qual muita gente incluindo eu,
não faz grande ideia de como funciona o tema. A pergunta era mais ou menos a seguinte: “Qual é descrição correcta de pinned buffer num contexto de database buffer cache?”

A resposta certa aparentemente e segundo o exame que estava a simular: “O buffer que está actualmente a ser acedido”.
No entanto isto pareceu-me um pouco confuso e decidi investigar melhor o assunto. Cheguei a algumas conclusões:

1 – O motor do Oracle pode fazer “pin” a um buffer, refere-se a um bloco na buffer cache;

2 – O utilizador não tem qualquer controlo sobre a possibilidade de manipular a criação do “pin”, estando apenas ao alcance do motor do Oracle. Assim sendo é impossível fazer “pin” explicito de qualquer objecto.

3 – É possível ver a actividade de “pinning” na view v$sysstat.


SQL> select name, value from v$sysstat where name in ('buffer is pinned count', 'buffer is not pinned count');

NAME VALUE
---------------------------------------------------------------- ----------
buffer is pinned count 37880
buffer is not pinned count 93843

4 – O conceito é apenas garantir que determinado objecto NÃO pode ser removido da memória enquanto estiver marcado como “pin”.

Sendo assim, e segundo o ponto 4, do ponto de vista do utilizador o termo “pinning” não se aplica na database buffer chache, ou seja, senão há possibilidade de fazer “pinning” explicito, então essa tarefa cabe ao motor. Ou os dados são usados e é feita a chache, ou não são usados e não é feita cache. Se os dados são usados, irão manter-se na cache.
A buffer cache é divida em 3 pools: DEFAULT pool, RECYCLE pool e KEEP pool. Os blocos que são lidos uma vez e descartados e nunca mais lidos fazem parte da RECYCLE pool, como por exemplo full table scans que usam grandes segmentos com padrões de acesso aleatórios.
Blocos (pequenos segmentos, por ex) que são usados muito frequentemente são candidatos para a KEEP pool.
Para a DEFAULT pool vai tudo o resto.
É importante salientar que todos os blocos estão sujeitos a serem expulsos de qualquer umas das pools, mesmo da KEEP. Isto depende da memória atribuida a cada pool e da actividade em geral da BD.

No entanto para a library cache, é possível ao DBA manter objectos na cache (SHARED POOL) via DBMS_SHARED_POOL.KEEP. Isto permitirá que os blocos pertencentes aos objectos não “envelheçam” e não sejam expulsos da SHARED POOL. No entanto este mecanismo, aparenta, nada ter a ver com o algoritmo de “pinning” nem para a buffer cache nem para a library cache.

Uma questão complexa esta, no entanto continuo com problemas em entender porquê a resposta à pergunta se referir ao buffer que está a ser usado, se segundo esta pequena investigação, nada tem a ver com isso. É um caso tipico que uma resposta leva a muitas mais complexas perguntas.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s