Banco de dados

Propaganda
AULA 06
Tuning de Banco de Dados
INTRODUÇÃO AO OWI
Na aula anterior...
Começamos a estudar OWI, vimos que todo o nosso problema associado a lentidão está sempre
ligado a gargalos em banco de dados.
Para cada gargalo existe um evento de espera específico que deve ser analisado para que
possamos conhecer o que realmente está impactando na performance do nosso ambiente.
Falamos sobre o evento de espera chamado Buffer Busy Waits e vimos que está diretamente
ligado aos chamados hotblocks.
Continuando OWI
Hoje continuaremos trabalhando com eventos de espera suas causas e a forma de tentar evitálos.
Na aula de hoje vamos imaginar uma situação onde uma usuária nos liga dizendo que ao chegar
para trabalhar o sistema dela está muito lento. Você então pergunta para ela onde
especificamente ela percebeu o problema.
A usuária então te fala que existem diversos processos com problema.
Você que já está ficando experiente em resolver problemas de performance já percebeu que na
reclamação dela existe uma palavra chave: DIVERSOS.
Sendo assim você decide que não é uma boa alternativa pensar em problema isolado e analisar
trace.
Você então prefere pedir para que ela rode novamente o processo e vai investigar o ambiente
como um todo.
MAS COMO FAZER ISSO??
OWI no ambiente real
Localizando gargalos
Lembra que na aula anterior nós falamos a respeito da query que ajudava a localizar gargalos?
Pois bem, mãos a obra...
Você então roda a query abaixo e percebe um novo evento de espera acontecendo para várias
sessões no banco de dados.
SELECT i.instance_name, w.event, COUNT (*), SUM (seconds_in_wait)
FROM gv$instance i, gv$session_wait w
WHERE i.inst_id = w.inst_id
AND event not like 'Streams AQ%'
AND event not like 'queue messages%'
AND event not like 'SQL*Net%'
AND (w.inst_id, SID) IN (SELECT inst_id, SID FROM gv$session WHERE status = 'ACTIVE'
AND username IS NOT NULL)
GROUP BY i.instance_name,eventORDER BY 3 DESC;
Eventos de espera mais comuns
db file scattered read
Você acaba de descobrir que um novo evento de espera acontece no seu banco de dados. Ele
se chama db file scattered read. Então você precisa inicialmente entender o que este evento
tem para te falar.
Vamos a ele?
O evento db file scattered read, significa que que o processo do usuário (a sessão) está lendo
buffers na SGA (buffer cache) porém está tendo que esperar muito por leitura física no disco
I/O.
De base desta informação veja o leque de informações que se abre para que possamos
analisar.
Pense comigo...
Eventos de espera mais comuns
db file scattered read
O processo de usuário está lendo do buffer mas está demorando esperando buscar no disco.
Só por esta informação percebemos que a taxa de acertos da SGA, está ruim.
A taxa de acerto que eu chamo é quando dados são procurados e eles estão em memória,
não necessitando buscar em disco.
Outra coisa que podemos analisar é que poderemos ter algum problema em disco causando
esta lentidão.
Porém aqui cabe um parênteses importante. Falar em problema de disco significa ter que
envolver pessoal de storage, SO... E seria muito chato depois de tudo descobrir que talves
uma simples configuração de banco de dados melhorasse não é mesmo?
Sendo assim vamos seguir entendendo o evento de espera que é bem melhor para nós.
Eventos de espera mais comuns
db file scattered read
O termo scattered read quer dizer leitura dispersa, ou seja lendo em vários locais da memória
ao mesmo tempo, onde pode quase sempre ter que buscar em disco.
O grande vilão deste evento de espera são as leituras em FULL table SCAN, ou seja varredura
da tabela toda para se buscar os dados ou ou índices mal criados que geram leitura full scan
também.
Quando um full scan ocorre normalmente os blocos lidos não estão fisicamente adjacentes,
em seu armazenamento no disco, ou seja ordenados na ordem de leitura. Sendo assim torna a
leitura mais demorada.
Sempre que encontrarmos este evento de espera é interessante que se analise as queries das
sessões onde ele está ocorrendo.
Lembra que temos uma query qye traz quais sessões tem o evento?
Vamos usá-la para verificar o SID e SERIAL# e identificar as queries rodando e pegar quais tem
o evento.
Eventos de espera mais comuns
db file scattered read
Sabendo qual o SID da sessão e o SERIAL# podemos facilmente descobrir o
que a sessão está fazendo utilzando uma nova query, simples porém
objetiva:
select * from v$sql
where address = (select sql_address from v$session where sid =26 and serial#=32145);
O sid e serial você informa de acordo com o descoberto pela query da aula
passada.
Sabendo qual a query poderemos facilmente gerar um plano de execução
da query.
Mas o que é de fato este plano de execução???
Eventos de espera mais comuns
Um plano de execução.
O plano de execução de uma query será objeto de um capítulo específico do curso, porém é
interessante fazer um breve comentário a respeito dele para que possamos entender o que
ele traz o que é.
Um plano de execução é como um plano de vôo, que diz qual a melhor forma de se chegar a
algum lugar. No Banco de Dados ele mostra qual a melhor forma de se acessar os dados e
trazê-los para a requisição do usuário.
Se engana quem pensa que este plano de execução é sempre a melhor forma de acessar os
dados. Muitas das vezes uma tarefa do tuning é fazer mudar o plano de execução.
Mas para sabermos como a nossa query em questão está sendo executada precisamos saber
o plano de execução.
Para isso existe uma forma bem simples para isso utilizando o comando EXPLAIN PLAN.
Eventos de espera mais comuns
Utilizando o comando EXPLAIN PLAN.
O comando explain é utilizando da seguinte forma:
No SQLPLUS faça:
SQL> EXPLAIN PLAN FOR
SELECT ... (aqui coloca a query completa)
Depois para saber o plano de execução utiliza-se:
SQL> set pages 1000
set lines 120
select * from table(dbms_xplan.display)
/
Eventos de espera mais comuns
Identificando a query.
Na query, ou melhor, no plano de execução procure pela palavra FULL ela pode aparecer em
full table ou full index.
De posse desta informação e com o evento de espera que conhecemos hoje, já podemos
verificar que provavelmente ele é proveniente de uma query mal feita.
Não se engane porém achando que todo FULL é ruim; se fosse assim era muito fácil de banir
ele do banco de dados.
Antes de condenar o FULL scan verificamos o tamanho da tabela, a quantidade de linhas que
serão lidas. Quando o FULL ocorre em uma tabela muito pequena em quantidade de linhas
com certeza ele não será impactante para o ambiente e o sistema escolheu certo em fazê-lo.
Isso é facilmente identificado com um select count(*) from tabela;
Então a grande lição de hoje é: antes de condenar procure ouvir os dois lados SEMPRE!
Bem mas se percebermos que o FULL não deveria ocorrer e que seria muito melhor com a
utilização de um índice devemos então quem sabe criá-lo.
Eventos de espera mais comuns
Estimando criação de um índice.
A criação de um índice requer espaço em storage e deve ser analisada.
Pode nem ser o foco do nosso curso mas acho muito interessante explicar e o DBA saber.
Se precisarmos estimar o espaço na criação de um índice a package abaixo poderá ajudar da
seginte forma:
Declare
u_bytes number;
a_bytes number;
Begin
dbms_space.create_index_cost (ddl => 'CREATE UNIQUE INDEX OWNER.NOME_INDICE ON OWNER.NOME_TABELA'
||'(COLUNAS INDEXADAS SEPARADAS POR VIRGULA) tablespace TBSPC_INDEX',
used_bytes => u_bytes,
alloc_bytes=> a_bytes);
dbms_output.put_line ('Used Bytes = '|| u_bytes);
dbms_output.put_line ('Allocated Bytes = '|| a_bytes);
end;
/
Eventos de espera mais comuns
Estimando criação de um índice.
Como resultado temos algo parecido com:
Used Bytes = 2514576775 bytes ou 2,34Gb à ocupará este valor em bytes para dados
Allocated Bytes = 4160749568 ou 3,87Gb à ocupará este valor dentro do tablespace de índice (valor alocado).
Valor alocado será diferente de acordo com a configuração do tablespace.
Assim poderemos prever o tamanho de espaço necessário para a criação de um índice.
Eventos de espera mais comuns
db file scattered read
Voltando ao evento de espera encontrado ainda poderemos analisar um parâmetro que
normalmente é setado automaticamente pelo banco de dados a partir da versão 10 mas que
poderemos alterá-lo e com isso aumentar ou diminuir a incidência de full tables scan.
Estou falando do parâmetro DB_FILE_MULTIBLOCK_READ_COUNT, que basicamente dirá para
o banco quantos blocos poderão ser lidos ao mesmo tempo.
Quando maior este número mais interessante se torna um full table scan, quanto menor
menos interessante seria para o otimizador escolher fazer FULL SCAN.
Existe uma regra para calculo de um bom valor deste parâmetro que falaremos no momento
oportuno.
Por uma questão de teste poderíamos fazer a alteração dele com alter session apenas na
sessão para verificar a performance da query.
ATENÇÃO!!
Dica
Para a aula de hoje cabe uma dica muito interessante e importante, sempre que analisar uma
query por um problema de lentidão e pensar em alteração de parâmetro de inicialização,
como no caso citado anteriormente, pense no banco de dados como um todo e lembre-se que
parâmetros de inicialização influenciam o banco de dados como um todo.
Se for mesmo muito necessária a alteração do parâmetro, por uma determinação do
fabricante da aplicação ou algo do gênero, o mesmo poderá ser feito através de trigger de
logon onde seta o parâmetro apenas para a sessão de usuário determinado, ou até mesmo
inserir na aplicação o alter session de alteração na aplicação antes da query.
Não deixe que para resolver um problema crie-se outros.
Tuning banco de dados
Próxima aula...
Na próxima aula vamos dar prosseguimento ao estudo dos eventos de espera
suas causas e algumas formas de evitá-los.
AULA 06
Tuning de Banco de Dados
FIM
Download