O HWM - High Water Mark é uma fronteira entre o espaço usado e não usado do segmento.Quando ocorre um solicitação para uso de novos blocos e essa requisição não pode ser atendida pela atual lista de blocos livres, o bloco atual que possue a marca d´água é marcado como usado e a marca avança para o seguinte. Em outras palavras, todo segmento que está a esquerda da marca é usado e o espaço a direita é livre.
Quando uma tabela é criada um número inicial de blocos / extensão são alocados para a tabela. Depois, com o aumento de número de operações DML, novas extensões são alocadas de acordo com a demanda.
Vamos a um exemplo prático para entender melhor. Criei um tabela para teste com a mesma estrutura da visão dba_users:
CREATE TABLE teste AS (SELECT * FROM dba_users WHERE rownum<0 nbsp="" p="">
Após alguns insertes:
INSERT INTO teste (SELECT * FROM dba_users);
COMMIT:
Realizando uma consulta na DBA_SEGMENTS, Temos para nossa tabela: 1 extensão contendo 8 blocos. Mas de fato, só poderemos usar 7 dos 8 blocos, pois um deles é destinado ao header.
SELECT BLOCKS,EMPTY_BLOCKS,NUM_ROWS FROM dba_tables WHERE table_name='TESTE' and owner='THIAGO';
BLOCKS EMPTY_BLOCKS NUM_ROWS
---------------------- ---------------------- ----------------------
1 6 57
Executando o mesmo insert 11 vezes, DBA_SEGMENTS nos mostra:
BLOCKS EXTENTS
---------------------- ----------------------
16 2
E DBA_TABLES depois do ANALYZE nos mostra:
BLOCKS EMPTY_BLOCKS NUM_ROWS
---------------------- ---------------------- ----------------------
12 3 627
Após os inserts, a marca d´água de nossa tabela foi alterada. Agora temos 16 blocos e 2
segmentos. Agora vamos realizar operações de delete e ver o comportamento da tabela.
DELETE teste WHERE rownum < 200;
COMMIT;
BLOCKS EMPTY_BLOCKS NUM_ROWS
---------------------- ---------------------- ----------------------
12 3 428
Note que o número de blocos é o mesmo, porém o número de linhas foi reduzido. Para determinar
o número exato de blocos que contém dados usaremos a consulta abaixo, nela consultaremos
o primeiro e o último bloco pelo rowid.
SELECT COUNT (distinct dbms_rowid.rowid_block_number(rowid)||'-'||dbms_rowid.rowid_relative_fno (rowid)) "blocos usados"
FROM TESTE;
blocos usados
----------------------
7
Veja, tínhamos 16 blocos reservados para a tabela, 12 estavam formatados para receber dados,
mas segundo nossa consulta apenas 7 desses possuem dados. Para reorganizar a tabela
e também reajustar a marca d´água temos três opções.
- TRUNCATE TABLE teste ( Apaga todos os dados da tabela)
- ALTER TABLE teste MOVE (Pode ser usado para mover a tabela para uma outra tablespace)
- ALTER TABLE teste SHRINK SPACE ( Introduzido na versão 10g)
Quando uma tabela é criada um número inicial de blocos / extensão são alocados para a tabela. Depois, com o aumento de número de operações DML, novas extensões são alocadas de acordo com a demanda.
Vamos a um exemplo prático para entender melhor. Criei um tabela para teste com a mesma estrutura da visão dba_users:
CREATE TABLE teste AS (SELECT * FROM dba_users WHERE rownum<0 nbsp="" p="">
Após alguns insertes:
INSERT INTO teste (SELECT * FROM dba_users);
COMMIT:
Realizando uma consulta na DBA_SEGMENTS, Temos para nossa tabela: 1 extensão contendo 8 blocos. Mas de fato, só poderemos usar 7 dos 8 blocos, pois um deles é destinado ao header.
SELECT BLOCKS,EMPTY_BLOCKS,NUM_ROWS FROM dba_tables WHERE table_name='TESTE' and owner='THIAGO';
BLOCKS EMPTY_BLOCKS NUM_ROWS
---------------------- ---------------------- ----------------------
1 6 57
Executando o mesmo insert 11 vezes, DBA_SEGMENTS nos mostra:
BLOCKS EXTENTS
---------------------- ----------------------
16 2
E DBA_TABLES depois do ANALYZE nos mostra:
BLOCKS EMPTY_BLOCKS NUM_ROWS
---------------------- ---------------------- ----------------------
12 3 627
Após os inserts, a marca d´água de nossa tabela foi alterada. Agora temos 16 blocos e 2
segmentos. Agora vamos realizar operações de delete e ver o comportamento da tabela.
DELETE teste WHERE rownum < 200;
COMMIT;
BLOCKS EMPTY_BLOCKS NUM_ROWS
---------------------- ---------------------- ----------------------
12 3 428
Note que o número de blocos é o mesmo, porém o número de linhas foi reduzido. Para determinar
o número exato de blocos que contém dados usaremos a consulta abaixo, nela consultaremos
o primeiro e o último bloco pelo rowid.
SELECT COUNT (distinct dbms_rowid.rowid_block_number(rowid)||'-'||dbms_rowid.rowid_relative_fno (rowid)) "blocos usados"
FROM TESTE;
blocos usados
----------------------
7
Veja, tínhamos 16 blocos reservados para a tabela, 12 estavam formatados para receber dados,
mas segundo nossa consulta apenas 7 desses possuem dados. Para reorganizar a tabela
e também reajustar a marca d´água temos três opções.
- TRUNCATE TABLE teste ( Apaga todos os dados da tabela)
- ALTER TABLE teste MOVE (Pode ser usado para mover a tabela para uma outra tablespace)
- ALTER TABLE teste SHRINK SPACE ( Introduzido na versão 10g)
Comentários