Um pouco sobre Consistent Gets
Eu sei que esse assunto é bem amplo, e basicamente demanda bastante explicação. O Objetivo deste post foi ser bastante claro e direto sobre como encontrar os principais “Consistent Gets” no Oracle.
O que são consistent Gets/Reads?
São leituras consistentes. Uma vez que o Oracle garante a leitura dos dados íntegra, toda vez que um bloco é alterado por uma sessão, o Oracle Database necessita de leitura consistente desse bloco, reconstruindo o mesmo utilizando UNDO. Existem 2 situações em que um bloco pode se encontrar: CONSISTENT ou CURRENT
Este é o número de blocos lidos da buffer cache para instruções/queries sem a opção de SELECT FOR UPDATE.
O Valor desta estatistica mais o valor de “db block gets” (Leituras comuns) compoem o que é conhecido como “logical reads” (leituras em memória), estas são geralmente a versão atual do bloco (CURRENT) mas também pode ser uma versão de CR (Consistent Read)
Somando “consistent gets” e “db block gets,” chega-se ao número de logical reads (memory reads).
Usando a equação abaixo, você pode calcular o Data Cache Hit Ratio:
Hit Ratio = (Logical Reads – Physical Reads) / Logical Reads
Abaixo uma query para fazer este cálculo:
column phys format 999,999,999 heading 'Physical Reads'
column gets format 999,999,999 heading ' DB Block Gets'
column con_gets format 999,999,999 heading 'Consistent Gets'
column hitratio format 999.99 heading ' Hit Ratio '
select sum(decode(name,'physical reads',value,0)) phys,
sum(decode(name,'db block gets',value,0)) gets,
sum(decode(name,'consistent gets', value,0)) con_gets,
(1 - (sum(decode(name,'physical reads',value,0)) /
(sum(decode(name,'db block gets',value,0)) +
sum(decode(name,'consistent gets',value,0))))) * 100 hitratio
from v$sysstat;
Exemplo de output:
Physical Reads DB Block Gets Consistent Gets Hit Ratio
-------------- -------------- --------------- -----------
1,671 39,561 71,142 98.49
Quais operações podem gerar maior numero de leituras Consistentes? (CR)
- Índices com cardinalidade incorreta
- Grande número de Alteração de Dados (DML, DELETE, UPDATE, etc) com COMMITs separadas em intervalos muito grandes
- FTS (Full Table SCAN) – Não utilização de índices
Algumas recomendações para diminuir grandes números de CR, estes pontos também ajudam a diminuir versionamento de blocs e enfileiramento CBC (cache buffer chains), mas esta é outra história:
- Índices corretamete utilizados, com seletividade correta;
- Utilização de cursors ou loops inadequados;
- Pontos Flutuantes em Queries (Tabelas não utilizadas pela query);
- Utilização de Hints;
- Coleta de estatísticas;
Algumas operações que exigem leituras consistentes / “Consistent Gets”
transaction tables consistent read rollbacks
Número total de vezes que uma query copia o Header de um segment/bloco de
undo para iniciar uma operaçãod e Rollback
transaction tables consistent reads – undo records applied
Para executar um Rollback uma query lê o bloco de controle (dentro do Header do Bloco de Undo) que contém informações da query inclusive a verão mais recente da query. Dentro deste bloco de controle existe a informação do bloco anterior em relação a query executada, que precisa reconstruir a informação até chegar ao bloco antes do ínicio da execução a alteração daquele bloco. Estenúmero de registros/blocos lidos é contado nesta métrica.
no work – consistent read gets
Número de vezes que o Oracle executa um “consistent read” verificando se um bloco precisa ou não ser utilizado para rollback.
cleanouts only – consistent read gets
Número de blocos que o Oracle considera como “cleaned” e não utilizam rollback
rollbacks only – consistent read gets
Número de blocos que o Oracle precisa utilizar para rollback. Estes não estão- em estado “cleaned”
rollbacks only – consistent read gets
Número de blocos que o Oracle precisa utilizar para rollback. Estes não estão cleanouts and rollbacks – consistent read gets
Blocos que aguardam como “cleaned” ou “rollback”
data blocks consistent reads – undo records applied
Blocos clonados para gerar um novo CR (Consistent Read).
rollback changes – undo records applied
Blocos lidos de Rollback
Referência
- Oracle Database 10g Performance & Tuning – Tips and Techniques (Oracle press – RICHARD NIEMEIC)
abs