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;

No comments: