Showing posts with label hwm. Show all posts
Showing posts with label hwm. Show all posts

Thursday, March 19, 2009

Segment Advisor and Shrink database segnments online.Porque usar esta feature?

by Julio Cesar Correa

Shrink database segnments

Para que possamos compactar o espaço causado pela fragmentação baixo da HWM(high water mark).Depois do shrink a HWM é movida para baixo
e assim colocando disponivel o espaço que antes não poderia ser utilizado.

Quando é feito um insert/apdate em que a tabela é aumentada(tamanho em blocos).A HWM informa a quantidade de blocos alocados para este segmento.
O caso pe que quando acontece um delete/update em que o tamanho sda tabela fisica é diminuido, a HWM não é atualizada para baixo,ou seja,não é atualizada
com a informação que diminuiu de tamanho.Portanto existe espaço livre neste segmento,mas ele não pode ser utilizado.

Até que executemos um online segment shrink,que vai ajustar a marca d'agua ou HMW.

O segmento tem que ser elegível ao online segment shrink.Caso não seja,o DBA poderá usar online table redefinition via EM ou DBMS_REDEFINITION.

Vantagens:
- Pode ser feita on-line.
- Podem ocorrer queries e DML's normalmente no segmento,porem no final da operação os DML's serão bloqueados por um curto perido de tempo.
- Os indices são mantidos,porem só é possivel usá-lo no final da operação.
- Não requer mais espaço para a operação(diferente de online table redefinition)

Restrições:
1. os seguimentos devem estar em uma tablespace LMT(locally managed tablespace) com ASSM(automatic segment space management).
2. todos os seguimentos dentro do intem um são elegíveis exceto: IOT's,tabelas com materialized views baseada em rowid e tabelas com indices
baseados em função(function-based indexes)

requerimentos:

Habilitar a movimentação de linhas na tabela.

ALTER TABLE table_name ENABLE ROW MOVEMENT ;

--Inicio do bloco pl/sql

variable id number ;

DECLARE

name_task varchar2(100);
desc_task varchar2(500);
obj_id number ;

BEGIN

--execute immediate 'alter table cmt.userdocuments enable row movement';

begin
name_task := '' ;
desc_task := 'Teste do uso de segment advisor na tabela userdocuments';

dbms_advisor.create_task(
advisor_name => 'Segment Advisor',
task_id => :id,
task_name => name_task,
task_desc => desc_task );

/*dbms_advisor.create_object(
task_name => name_task,
object_type =>'TABLE',
attr1 => 'CMT',
attr2 => 'USERDOCUMENTS',
attr3 => null,
attr4 => null,
attr5 => null,
obj_id => obj_id) ; */

dbms_advisor.create_object(name_task,'TABLE','CMT','USERDOCUMENTS',NULL,NULL,obj_id) ;

dbms_advisor.set_task_parameter(
task_name => name_task,
parameter => 'recommend_all',
value => 'TRUE');

dbms_advisor.execute_task (name_task) ;

end;

END;