- Este tópico contém 3 respostas, 2 vozes e foi atualizado pela última vez 15 anos, 2 meses atrás por
Niggaz.
-
AutorPosts
-
23 de dezembro de 2010 às 5:02 pm #97424
Niggaz
ParticipanteBom dia galera!
Já vou adiantar meus votos: Um feliz Natal , muita saúde, paz e prosperidade para todo mundo!
Eu estou com a seguinte dúvida: Qual seria a melhor forma de desfragmentar uma tabela? utilizando o ALTER TABLE…MOVE ou a forma ENABLE ROW MOVEMENT, SHRINK?
Não digo qual seria a melhor, pois acredito que o efeito deve ser o mesmo…ou estou errado?
E como computar as estatisticas corretamente: Com DBMS_STATS.GATHER_TABLE_STATS ou compute statistics?
Abraços
23 de dezembro de 2010 às 8:56 pm #97436hudsona
ParticipanteFala Niggaz
Pra mim a melhor forma é atraves das CTAS (create table as select), quando tenho certeza que realmente a tabela framentada, prefiro essa soluçao.
Lembrando que se for utilizar outras formas, vai precisar dar um rebuild nos indexes.
Sim utilize a package DBMS_STATS.GATHER_TABLE_STATS para computar estatisticas.Abs
23 de dezembro de 2010 às 9:08 pm #97438Niggaz
ParticipanteFala hudsona, obrigado pela resposta.!!
Acho que não vai rolar CTAS pq são tabelas utilizadas num sistema, e tem que ser de outra forma mesmo.
Dê uma olhada no script que eu estou montando(futuramente vou criar uma procedure que pegue todos os usuários do meu banco)…Ainda está meio amador, até pq não sou expert em script…rs
DECLARE
--Variaveis
v_emp VARCHAR(8);
v_owner DBA_TABLES.OWNER%TYPE;
v_table DBA_TABLES.TABLE_NAME%TYPE;
v_blocks DBA_TABLES.BLOCKS%TYPE;
v_eBlocks DBA_TABLES.EMPTY_BLOCKS%TYPE;
v_tBlocks VARCHAR2(50);
v_analyzed DBA_TABLES.LAST_ANALYZED%TYPE;
v_tamanho VARCHAR2(50);
v_indexName DBA_INDEXES.INDEX_NAME%TYPE;
--v_sql VARCHAR(50);
--Cursor DBA_TABLES
CURSOR c_dbaTables IS
SELECT
OWNER
,TABLE_NAME
,BLOCKS
,EMPTY_BLOCKS
,BLOCKS*8192/1024/1024 "TAMANHO"
,TO_CHAR(LAST_ANALYZED,'DD/MM/YYY') "ANALYZED"
FROM DBA_TABLES
WHERE OWNER = 'UNIS253'--MUDAR
AND TABLE_NAME IN
('TPT200',
'TPT210',
'TPT300',
'TPT310',
'TPT701',
'TPT703');
--Cursor DBA_SEGMENTS
CURSOR c_dbaSegments IS
SELECT
OWNER
,SEGMENT_NAME
,SUM(BYTES)/1024/1024 "TAMANHO"
FROM DBA_SEGMENTS
WHERE OWNER = 'UNIS253'
AND SEGMENT_NAME IN
('TPT200',
'TPT210',
'TPT300',
'TPT310',
'TPT701',
'TPT703')
GROUP BY OWNER , SEGMENT_NAME;
--Cursor DBA_INDEXES
CURSOR c_dbaIndexes IS
SELECT
OWNER
,INDEX_NAME
FROM DBA_INDEXES
WHERE OWNER LIKE 'UNIS%'
AND STATUS = 'UNUSABLE';
BEGIN
OPEN c_dbaIndexes;
LOOP
FETCH c_dbaIndexes INTO v_owner, v_indexName;
EXIT WHEN c_dbaIndexes%NOTFOUND;
EXECUTE IMMEDIATE 'ALTER INDEX '||v_owner||'.'||v_indexName||' REBUILD';
END LOOP;
CLOSE c_dbaIndexes;
OPEN c_dbaTables;
LOOP
FETCH c_dbaTables INTO v_owner, v_table, v_blocks, v_eBlocks, v_tBlocks, v_analyzed;
EXIT WHEN c_dbaTables%NOTFOUND;
DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>v_owner,TABNAME=>v_table,ESTIMATE_PERCENT=>NULL,METHOD_OPT=>'FOR ALL COLUMNS SIZE AUTO',DEGREE =>6);
INSERT INTO Analisa VALUES (1, v_owner, v_table, v_blocks, v_eBlocks, v_tBlocks, sysdate);
END LOOP;
CLOSE c_dbaTables;
OPEN c_dbaSegments;
LOOP
FETCH c_dbaSegments INTO v_owner, v_table, v_tamanho;
EXIT WHEN c_dbaSegments%NOTFOUND;
INSERT INTO Analisa(ETAPA, OWNER,TABELA,TAMANHO) VALUES (2,v_owner, v_table, v_tamanho);
EXECUTE IMMEDIATE 'ALTER TABLE '||v_owner||'.'||v_table||' MOVE';
END LOOP;
CLOSE c_dbaSegments;
END;
/
Acrescentaria alguma coisa ou tiraria outra??
Abraços
28 de dezembro de 2010 às 4:12 pm #97464Niggaz
ParticipanteNinguém?
-
AutorPosts
- Você deve fazer login para responder a este tópico.