Opa, começou a clarear.
Vejamos, se a tabela sofre muito INSERT/UPDATE/DELETE, uma hora vai mesmo ficar
fragmentada.
Um script que uso para identificar isso, mostra o candidato a REORG escolhido
pela maior quantidade de espaço desperdiçado (WASTED):
set lines 200;
column owner format a15;
column segment_name format a30;
select
a.owner,
a.segment_name,
a.segment_type,
round(a.bytes/1024/1024,0) MBS,
round((a.bytes-(b.num_rows*b.avg_row_len) )/1024/1024,0) WASTED
from dba_segments a, dba_tables b
where a.owner=b.owner
and a.owner='&w_OWNER'
and a.segment_name = b.table_name
group by a.owner, a.segment_name, a.segment_type, round(a.bytes/1024/1024,0)
,round((a.bytes-(b.num_rows*b.avg_row_len) )/1024/1024,0)
having round(bytes/1024/1024,0) >100
order by round(bytes/1024/1024,0) desc ;
Os atributos blob, vc pode melhorar a organização, quando vc cria uma
tablespace esclusiva para eles e faz um MOVE prá lá:
select 'alter table '||owner||'.'||table_name ||' move lob ('
||column_name||')' || ' store as (tablespace SOMENTE_BLOBS);' retorno
from dba_lobs
where segment_name in (select segment_name
from dba_segments
where tablespace_name='MY_DATA' and owner='MY_OWNER' and
segment_type='LOBSEGMENT');
(SOMENTE_BLOBS, MY_DATA e MY_OWNER: substitua conforme seu uso).
Após mover os LOBS, a tabela não foi mexida, pois o segmento de lob já é
separado dos dados da tabela (esta parte já estava clara, confere?). Observe
que depois de organizar a tabela, pode haver necessidade de REORG da tablespace
(mas não vamos misturar os tópicos).
Agora sim, para organizar a tabela, vai bastar:
alter table TABELA_CANDIDATA enable row movement;
(
alter table TABELA_CANDIDATA shrink space cascade;
ou
alter table TABELA_CANDIDATA move;
ou
alter table TABELA_CANDIDATA move NOVA_TABLESPACE; <<--- aqui vc pode fazer um
VAI-E-VOLTA
--alter table TABELA_CANDIDATA move TABLESPACE_ORIGINAL; <---fica muito bom.
)
Depois disto, os indices vão ficar inválidos, verifique:
--Indice
select 'ALTER INDEX ' || INDEX_NAME || ' REBUILD;' Sentenca
from user_indexes
where STATUS <> 'VALID';
Na parte de mudar o tipo de uma coluna, eu prefiro criar uma nova coluna no
tipo e tamanho certo e rodar um update para tratar o dado original, copiando o
valor para a nova coluna, pois vc poderá conferir se os valores ficaram como vc
esperava (lembrar do backup antes tb é fundamental).
Em seguida verificar dependencias (indices e constraints naquela coluna devem
estar em um DDL pronto para ser executado após o procedimento): rodar o drop na
coluna antiga com cascade constraints, renomear a nova coluna para o nome
original e recriar as constraints/indices, recompilando também os objetos
invalidados pelo processo (pack, procs, funcs e triggers ...).
Como vc vê, isto exige que a tabela tenha lock exclusivo prá vc: procedimento
prá ser feito à noite ou fora dos horários de uso daquele objeto.
À disposição,
Ederson Elias
DBA Oracle - http://br.linkedin.com/pub/ederson-elias/24/8b/8b0
------------ Labor improbus omnia vincit
---Em [email protected], <reginaldo@...> escreveu:
Olá Ederson, boa tarde.
Então, as necessidades são as mais diversas: Reog mesmo (tabelas que sofrem
muito inserts e deletes (para esses casos o ganho de performance é imenso),
mudança em tipo de campo por necessidade de negócio, ligar o "enable in storage
in row" nos xBLOB - essa necessidade para liberar espaço em disco, dentre
outras).
Testei a função "CAN_REDEF" e não havia problemas.
Uso no Oracle 11g Standard sem problemas, mas no Oracle 10g tem ocorrido essa
situação do lock. Li os manuais e em todos tinha "The table is locked in the
exclusive mode only during a very small window that is independent of the size
of the table and complexity of the redefinition, and that is completely
transparent to users". Não encontrei nada sobre lock na versão 10g.
E
Atenciosamente,
Reginaldo de Faveri da Silva
Administrador de Banco de Dados
Unidade Justiça
Softplan/Poligraph
+55 48 3027-8000
www.softplan.com.br http://www.softplan.com.br
twitter.com/softplanonline http://twitter.com/softplanonline
Em 18 de setembro de 2014 13:21, ederson2001br@... mailto:ederson2001br@...
[oracle_br] <oracle_br@... mailto:oracle_br@...> escreveu:
Reginaldo,
A versão STANDARD não tem a capacidade de fazer alguns procedimentos online. Se
houver mudaça de ROWID, vai acontecer bloqueio exclusivo na linha pela
transação que pediu primeiro, as demais transações vão sim esperar. Esta
condição não acontece com a versão ENTERPRISE.
Vc verificou também o resultado da DBMS_REDEFINITION.CAN_REDEF_TABLE ?
Dá uma lida no artigo http://www.dba-oracle.com/t_dbms_redefinition_example.htm
http://www.dba-oracle.com/t_dbms_redefinition_example.htm e
http://docs.oracle.com/cd/B28359_01/server.111/b28310/tables007.htm#ADMIN11677
http://docs.oracle.com/cd/B28359_01/server.111/b28310/tables007.htm#ADMIN11677
que tem uns exemplos, veja se encaixa no seu cenário.
Opcionalmente, considere escolher o tipo de reorg, pois os procedimentos
diferem bem como os impactos:
-Reorganizar PCT_FREE
-Shrink de tabela
-Mover para segmento inicial, quando a tabela foi bastante "esvaziada"
-Mover para outra tablespace
-Refazer indices
Conside também:
alter table xxx deallocate unused space;
alter table xxx SHRINK SPACE COMPACT;
alter table xxx move;
Explica melhor a sua necessidade, porque vc quer fazer reorg? A tabela ter
muitos dados não é problema para o banco. Já consultá-la, pode haver demora se
as suas consultas não estão otimizadas para o modelo, talvez criar/usar indices
mais específicos vá modificar o seu cenário.
Ederson Elias
DBA Oracle - http://br.linkedin.com/pub/ederson-elias/24/8b/8b0
http://br.linkedin.com/pub/ederson-elias/24/8b/8b0
------------ Labor improbus omnia vincit