Segment Advisor via SQL*Plus
O Segment Advisor identifica objetos com espaço não utilizado (um dos tipos de fragmentação), que pode ser disponibilizado para uso de outros objetos.
O Segment Advisor é executado automaticamente no Oracle 10gR1 em diante, mas também pode ser executado pontualmente via Enterprise Manager, ou mesmo via SQL*Plus, que é o tema aqui.
Tome cuidado para executar este procedimento somente em um horário de baixo impacto em sua produção, pois ele pode ser pesado, dependendo do tamanho dos objetos analisados.
C:\temp>sqlplus SYS/Nerv2013 AS SYSDBA
SQL*Plus: Release 11.2.0.3.0 Production on Seg Jul 22 15:32:56 2013
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Conectado a:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining,
Oracle Database Vault and Real Application Testing options
SQL> HOST TYPE SegAdv.sql
VARIABLE vID NUMBER;
BEGIN
DECLARE
vNAME VARCHAR2(100);
vDESCR VARCHAR2(500);
vOBJ_ID NUMBER;
BEGIN
vNAME:='Portilho Segment Advisor Task';
vDESCR:='Portilho Segment Advisor Task';
DBMS_ADVISOR.CREATE_TASK(ADVISOR_NAME=>'Segment Advisor',TASK_NAME=>'Portilho Segment Advisor Task',TASK_DESC=>'P
rtilho Segment Advisor Task');
DBMS_ADVISOR.CREATE_OBJECT(TASK_NAME=>'Portilho Segment Advisor Task',OBJECT_TYPE=>'TABLESPACE',ATTR1=>'USERS',AT
R2=>'NULL',ATTR3=>NULL,ATTR4=>NULL,ATTR5=>NULL,OBJECT_ID=>vOBJ_ID);
DBMS_ADVISOR.SET_TASK_PARAMETER(TASK_NAME=>vNAME,PARAMETER=>'RECOMMEND_ALL',VALUE=>'TRUE');
DBMS_ADVISOR.EXECUTE_TASK(vNAME);
END;
END;
/
SQL> @SegAdv.sql
Procedimento PL/SQL concluÝdo com sucesso.
SQL> SELECT BENEFIT_TYPE FROM DBA_ADVISOR_RECOMMENDATIONS WHERE TASK_NAME='Portilho Segment Advisor Task';
BENEFIT_TYPE
--------------------------------------------------------------------------------
Ative a movimentaþÒo de linha da tabela SCOTT.T e faþa uma compactaþÒo; a econom
ia estimada Ú de 92815387 bytes.
SQL> SELECT ATTR1, ATTR2, ATTR3 FROM DBA_ADVISOR_ACTIONS WHERE TASK_NAME='Portilho Segment Advisor Task';
ATTR1
--------------------------------------------------------------------------------
ATTR2
--------------------------------------------------------------------------------
ATTR3
--------------------------------------------------------------------------------
alter table "SCOTT"."T" shrink space
alter table "SCOTT"."T" shrink space COMPACT
alter table "SCOTT"."T" enable row movement
SQL> EXEC DBMS_ADVISOR.DELETE_TASK('Portilho Segment Advisor Task');
Procedimento PL/SQL concluÝdo com sucesso.
SQL>