Autor: Rafael Souza | Publicado: 2017-03-07T13:56:00-08:00



Database Buffer Cache


O database buffer cache também conhecida como buffer cache é a área de memória que armazena cópias dos data blocks que são lidos dos datafiles. Um buffer é o principal endereço de memória que o gerenciador de buffer temporário realiza o cache de data blocks usados no momento ou recentemente. Todos os usuários conectados ao banco de dados compartilham o acesso ao buffer cache.


Objetivo do buffer cache


O database buffer cache tem como objetivo otimizar a leitura e escrita física do banco de dados, esta sub área atualiza os data blocks dentro do cache e armazena o metadata sobre as mudanças realizadas dentro do redolog buffer. Após um commit o banco de dados escreve o redo log buffer para os arquivos de redolog mais não escreve imediatamente os
data blocks nos datafiles. Ao invés disto o database whiter DBWR realiza escrita em background de tempos em tempos. O database buffer cache também mantem os data blocks mais acessados no buffer cache e escreve em disco os data blocks menos acessados.


Buffer States – Unused/Clean/Dirty


O banco de dados utiliza um algoritmo interno para gerenciar o buffer dentro do cache. Um buffer pode estar em qualquer um dos seguintes estados. No caso do estado Unused, o buffer está disponível para uso, pois ele pode nunca ter sido usado ou o seu estado atual está como unused. Este tipo de buffer é o mais fácil para o banco de dados utilizar.
O estado Clean, quer dizer que o buffer foi usado anteriormente a agora contém uma versão de leitura consistente do block como de um determinado ponto no tempo. Resumindo, o bloco contém dados porém está limpo, então não é necessário sofrer um checkpoint, assim o banco de dados pode marcar este bloco e reutilizar. Dirty, este último estado significa que o buffer contém dados modificados que ainda não foram escritos em disco. Sendo assim o banco de dados precisa realizar o checkpoint do block antes de reutiliza-lo.


Buffer Modes – Current/Consistent


Quando um usuário solicita dados, o banco de dados Oracle recupera os buffers do database buffer cache nos dois seguintes tipos de modos:&nbsp;


Current mode


O modo current mode get, também conhecido como db block get, recupera o block como ele aparece atualmente dentro do buffer cache. Por exemplo, imagine uma transação que não sofreu commit e atualizou duas linhas em um determinado bloco, sendo assim o Current mode recupera o bloco com essas linhas que não sofreram commit. Neste cenário somente o usuário que realizou esta transação irá visualizar o dado neste formato, qualquer outro usuário que realizar uma consulta neste bloco irá visualizar as duas linhas como eram antes da atualização graças ao Consistent mode que iremos entender a seguir.&nbsp;


Consistent mode


O modo Consistent mode é a recuperação da versão de leitura consistente do bloco. Essa recuperação pode utilizar dados de undo. Por exemplo, imagine uma transação que atualizou duas linhas dentro de um bloco, e caso um SQL de outra sessão solicita esse mesmo bloco neste caso o banco de dados usa os dados de undo para criar uma versão com leitura consistente deste bloco, esta operação também é conhecida como (Consistent read clone), ela não inclui os dados atualizados que não sofreram commit. Basicamente o SQL da outra sessão recupera blocos dentro do Consistent mode.


Buffer I/O


Uma Logical I/O, também conhecida como buffer I/O refere-se as leituras e escritas de buffer dentro do buffer cache. Quando uma requisição de buffer não é encontrada na memória, o banco de dados realiza uma leitura física (physical I/O) para copiar o buffer a partir de flash cache ou disco para a memória, e então o buffer I/O realiza a leitura do buffer que está em cache.