Particionamento de Tabelas

DBA Geral (instalação, configuração do banco, scripts do Sql*Plus, shell scripts, batch scripts, etc...)
Responder
alexandrecrocha
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Seg, 31 Dez 2007 8:38 am
Localização: Porto Alegre - Rs

Bom dia,
Amigos, alguém poderia me ajudar ? Estou particionando uma table("OLD") de 75GB da seguinte maneira:
Crio uma table("NEW") "espelho" da OLD, porém com todas as partições necessárias para acomodar os registros, após isto faço uma carga da OLD para dentro da NEW, porém a NEW fica com 190GB. Porque ela fica maior(mais q o dobro) ? Não deveria ficar com o mesmo tamanho da OLD(75GB) ?
estou colocando o storage em cada partição da seguinte maneira:

Selecionar tudo

storage(initial 64k next 64K minextents 1 maxextents unlimited) 
já tentei tb initial=64K next=1M.
Obrigado!
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Ola alexandrecrocha,

Não sou especialista em particionamento de tabelas. Entendo até que outros foristas aqui poderiam dar uma explicação melhor do que a minha.

Então, explicando de forma "bem leiga", quando você particiona uma tabela, é como você criasse uma série de "sub-tabelas" desta tabela.

Então, você teria antes um único "segment_name" para sua tabela OLD. Quando você criou a tabela particionada, então, foram criados um "segment_name" para cada uma destas partições criadas. Estas partições acabam alocando espaço, mesmo que você não tenha registros para as mesmas.

Você poderia começar uma análise comparativa com esta querie:

Selecionar tudo

SELECT SEGMENT_NAME, SEGMENT_TYPE,SUM(BYTES),MAX(EXTENTS)
  FROM DBA_SEGMENTS
  WHERE OWNER='<dono_objeto>'
     AND  SEGMENT_NAME IN ('<relacao de tabelas+indice+particoes de OLD e NEW')
GROUP BY SEGMENT_NAME, SEGMENT_TYPE    
ORDER BY SEGMENT_NAME, SEGMENT_TYPE;
Você pode obter o nome das particoes da tabela NEW em DBA_TAB_PARTITIONS

Talvez isso te permita obter maiores subsídios para sua análise. Por favor, não se esqueça de postar sua análise aqui.

Abraços,

Sergio
Avatar do usuário
fbifabio
Moderador
Moderador
Mensagens: 199
Registrado em: Ter, 22 Fev 2011 1:51 pm
Localização: São Paulo - SP
Contato:
Fábio Prado
www.fabioprado.net

@alexandrecrocha ,

você provavelmente está usando no gerenciamento de tablespaces MSMM com parâmetros de armazenamento diferentes em cada tablespace, ou no mínimo está usando parâmetros de armazenamento diferentes em cada tablespace. Copie aqui o script DDL que você usou para criar a tabela particionada para eu tentar te ajudar.

[]s
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

alexandrecrocha,

Talvez você possa fazer um pequeno experimento, para compreender melhor a alocação de espaço das tabelas particionadas:

Selecionar tudo

/* Criando uma tabela particionada */
CREATE TABLE deptx_part (deptno NUMBER, deptname VARCHAR(32))
     STORAGE (INITIAL 10K)
     PARTITION BY HASH(deptno)
       (PARTITION p1 , PARTITION p2 ,
        PARTITION p3 , PARTITION p4);
        
/* Criando a tabela sem particoes */        
CREATE TABLE deptx (deptno NUMBER, deptname VARCHAR(32))
     STORAGE (INITIAL 10K);   
     
/*Efetuando uma carga ficticia */
INSERT INTO DEPTX SELECT ROWNUM,'DEPTO '||TO_CHAR(ROWNUM) FROM DBA_OBJECTS 
INSERT INTO DEPTX_PART SELECT ROWNUM,'DEPTO '||TO_CHAR(ROWNUM) FROM DBA_OBJECTS
COMMIT;

/* Coletando estatisticas  do schema  - você poderia coletar so das tabelas, ok? */
BEGIN
  DBMS_STATS.GATHER_SCHEMA_STATS
               (OWNNAME         => user,    
                ESTIMATE_PERCENT=> 100);
END;
/

/* Verificando informacoes sobre espaco ocupado em bytes */
SELECT * FROM USER_SEGMENTS WHERE SEGMENT_NAME LIKE 'DEPTX%'
SELECT SEGMENT_NAME,SUM(BYTES),MAX(EXTENTS) FROM USER_SEGMENTS WHERE SEGMENT_NAME LIKE 'DEPTX%' GROUP BY SEGMENT_NAME     

/* Avaliando total de linhas ocupados pelas tabelas */
select * from user_tables where table_name like 'DEPTX%'
select * from user_tab_partitions where table_name like 'DEPTX%'          
Você também poderia repetir o experimento, fornecendo os parametros de storage que mencionou na pergunta inicial, e avaliar se estas informações são consideradas nas informações armazenadas na USER_TAB_PARTITIONS
Abraços,

Sergio
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 6 visitantes