sábado, 23 de novembro de 2013

ORACLE DB PERFORMANCE TUNING WATER MARK

WATER MARK          


- A marca d’água indica até onde uma tabela cresceu
- Serve para definir a quantidade de blocos que uma determinada tabela está usando no momento.
- Mesmo excluindo os registros a marca d’água continua indicando o tamanho máximo de onde um dia chegou a quantidade de registros.


Condição Inicial dos Blocos Demarcados pela Water Mark
                       

Condição dos Blocos Demarcados pela Water Mark Após Delete.
                       

PRÁTICAS COM MARCA D'ÁGUA

Prática 1/6

A marca d’água indica até onde uma tabela cresceu. Serve para definir a quantidade de blocos que uma determinada tabela está usando no momento. Vamos criar a tabela TESTE para verificar o conceito:

drop table scott.teste; 

create table scott.teste (id number);


Prática 2/6


Neste momento a tabela está vazia e não há nenhuma estatística coletada para a mesma. A consulta abaixo ilustra essa situação:

------EXIBIR TABELA VAZIA-----------------
select owner, table_name, blocks, empty_blocks, num_rows, to_char(last_analyzed,'DD-MM-RRRR HH24:MI:SS') as "ANALYZE" from dba_tables where table_name = 'TESTE';


Prática 3/6


Vamos popular a tabela e verificar o impacto que isso gerará

insert into scott.teste values(1);

insert into scott.teste (select * from scott.teste);

insert into scott.teste (select * from scott.teste);

insert into scott.teste (select * from scott.teste);

insert into scott.teste (select * from scott.teste);

insert into scott.teste (select * from scott.teste);

insert into scott.teste (select * from scott.teste);

commit;

select owner, table_name, blocks, empty_blocks, num_rows, to_char(last_analyzed,'DD-MM-RRRR HH24:MI:SS') as "ANALYZE" from dba_tables
where table_name = 'TESTE';


Prática 4/6


Colete manualmente as estatísticas da tabela TESTE:

exec dbms_stats.gather_table_stats (ownname=>'SCOTT',tabname=>'TESTE',estimate_percent=>null,method_opt=>'FOR ALL COLUMNS SIZE AUTO',degree=>6);

 select owner, table_name, blocks, empty_blocks, num_rows, to_char(last_analyzed,'DD-MM-RRRR HH24:MI:SS') as "ANALYZE" from dba_tables where table_name = 'TESTE';


Prática 5/6


Para verificar onde está a marca d'água crie o script abaixo e o execute: 

set serveroutput on; 
DECLARE v_owner VARCHAR2(30)  := 'SCOTT' ; 
  v_segment_name VARCHAR2(30)  := 'TESTE';
  v_segment_type VARCHAR2(30)   := 'TABLE';
  v_total_blocks NUMBER;
  v_total_bytes NUMBER;
  v_unused_blocks NUMBER; 
  v_unused_bytes NUMBER;
  v_last_used_extent_file_id NUMBER;
  v_last_used_extent_block_id NUMBER;
  v_last_used_block NUMBER; 
BEGIN dbms_space.unused_space(v_owner, v_segment_name, v_segment_type,      v_total_blocks, v_total_bytes,v_unused_blocks, v_unused_bytes,  v_last_used_extent_file_id, v_last_used_extent_block_id, v_last_used_block );
 dbms_output.put_line(INITCAP(v_segment_type)||':'||v_owner||'.'||v_segment_name); 
 dbms_output.put_line('Total Blocos :'||TO_CHAR(v_total_blocks)); 
 dbms_output.put_line('Blocos depois da Marca DÁgua :'||TO_CHAR(v_unused_blocks));
END;
/


Prática 6/6


Observe o comportamento da marca d'água após o comando delete e o comando truncate

delete scott.teste;

executar o script da marca d'água

truncate table scott.teste;

executar o script da marca d'água.



Nenhum comentário:

Postar um comentário