sexta-feira, 7 de agosto de 2009

Dica de Tunnig - Identificando SQL’s Intensivos

Olá pessoal,como vão?

Bem, hoje me deparei com um assunto bem interessante enquanto lia um de meus livros que comprei a alguns anos, e uma página me chamou a atenção.

Via de regra todos nós nos preocupamos diariamente com a questão do Banco de Dados estar ou não atendendo as suas requisições, em tempos e performances aceitavéis, tanto para nós como para os demais usuários que praticam suas atividades negociais diariamente.

Ha uma maneira muito eficaz de se identificar os SQL’s ( Statement’s) mais intesivos do Banco, e que consequentemente por suas caracteristicas, poderiam e podem ser fortes candidatos a um pequeno TUNNING básico, uma reescrita, uma mudada na clausula WHERE, ou talvez até uma sugestão de indice, enfim, podemos localizar essas pequenas pulgas, que poderiam vir a se tornar verdadeira pragas em nosso Banco de dados, neste intuito vou postar uma query aqui que mostrará como localizar e verificar de que maneira andam se comportanto as instruções em seu banco de dados.

QUERY :

Descrição: Esta query ira mostrar a vocês as 20 sessões top em termos de intesidade, levando em consideração leituras á disco por execução, a partir da Release 9i com a implementação das colunas CPU_TIME e ELAPSED_TIME, ficou melhor e mais eficaz a visualização em termos de tempos de execução.

select
sql_text,
username,
disk_reads_per_exec,
buffer_gets,
disk_reads,
parse_calls,
sorts,
executions,
rows_processed,
hit_ratio,
first_load_time,
sharable_mem,
persistent_mem,
runtime_mem,
cpu_time,
elapsed_time,
address,
hash_value
from
(select sql_text,
username,
round((a.disk_reads/decode(a.executions,0,1,a.executions)),2)disk_reads_per_exec,
a.disk_reads,
a.buffer_gets,
a.parse_calls,
a.sorts,
a.executions,
a.rows_processed,
100 - round(100*a.disk_reads/greatest(a.buffer_gets,1),2) hit_ratio,
a.first_load_time,
sharable_mem,
persistent_mem,
runtime_mem,
cpu_time,
elapsed_time,
address,
hash_value
from
v$sqlarea a,
all_users b
where
a.parsing_user_id=b.user_id
and
b.username not in ('SYS','SYSTEM')
order by 3 desc)
where rownum < 21;

Vale salientar que essa query por questões mencionadas acima, não podem ser utilizadas em 8i, para que possam ser utilizadas , devemos ignorar as colunas que citamos acima.

Todos poderiam perguntar o seguinte : - Ah! Isso é passado já temos o AWR que pode nos mostrar isso, e temos também o Grid Control que pode nos dar um relatório em segundos, não preciso disso, vou usar onde isso?

Veja bem, em alguns locais de trabalho , tudo que se tem é uma Workstation, o SQL*Plus instalado e no máximo lhes deixariam plugar o seu PEN DRIVE nessa estação de trabalho ( risos) , é engraçado mais é a realidade, poranto quando mais armas você tiver e menos depender de interfaces WIZARD, melhor será seu aprendizado e suas capaciadades irão muito mais além, lhe destacando e diferenciando sempre dos demais profissionais.

Obrigado á todos pela atenção, espero que apreciem e que comentem.

Abraço!

P.S.: essa dica e muitas outras são de facil localização para aqueles que gostam de Livros Técnicos, sugiro visitarem a editora Rampant, tem excelentes titulos.