[oracle_br] Re: PARTICIONAMENTO DE TABELAS 9i

2010-08-31 Por tôpico Aparecido
Valeu Jorge, obrigado.

Cido

--- Em oracle_br@yahoogrupos.com.br, "interessado60"  escreveu
>
> Bom dia
> 
> sempre que tive este problema, executei o comando abaixo:
> 
> ALTER TABLE DWH.DW_A_BASE_DIARIA SPLIT PARTITION MES_200405_E_ACIMA 
> AT   (TO_DATE(' 2004-06-01 00:00:00', 'S-MM-DD HH24:MI:SS', 
> 'NLS_CALENDAR=GREGORIAN')) 
> INTO (PARTITION MES_200405  pctused 98 pctfree 1 TABLESPACE  
> TSD_DW_A_BASE_DIARIA_MAI04, 
>   PARTITION RESTANTE_MAXVALUE  pctused 98 pctfree 1 TABLESPACE  
> TBL_DWH_MAXVALUE )
> parallel (degree 16);
> 
> ##
>   para voce tirar a duvida de quem é quem, veja p PL abaixo:
> ##
> 
> # Procedimento de split da partição MAXVALUE, gerando a nova partição.
> #
> 
> # Garante que o nome da nova partição vai usar a descrição do mês em inglês
> export NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252
> export ORACLE_SID=ASPP1
> 
> sqlplus '/ as sysdba' << !EOF
> declare
>   --
>   W_TABELA  varchar2( 30 ) := '${1}';  -- Nome da tabela a ser 
> processada
>   W_SUFIXO_PART varchar2( 30 ) := '${2}';  -- Suxifo para compor o nome 
> das partições
>   W_PARTITION_NAME  varchar2( 30 );-- Nome da última partição
>   W_HIGH_VALUE  varchar2( 300 );   -- Valor de HIGH_VALUE da 
> última partição (antes da MAXVALUE)
>   W_DATA_HIGH_VALUE date;  -- Valor do HIGH_VALUE em 
> formato data
>   W_PART_NOME_NOVO  varchar2( 30 );-- Nome da nova partição
>   W_COMANDO_SPLIT   varchar2( 300 );   -- Statement de split para uso 
> com 'execute immediate'
>   --
> begin
>   --
>   -- Montagem do nome da nova partição
>   --
>   -- Descobre o nome e o high_value da última partição (antes da MAXVALUE)
>   select PARTITION_NAME, HIGH_VALUE
> into W_PARTITION_NAME, W_HIGH_VALUE
> from DBA_TAB_PARTITIONS
>where TABLE_OWNER= 'ASPP_DBA'
>  and TABLE_NAME = W_TABELA
>  and PARTITION_POSITION = ( select max( PARTITION_POSITION ) - 1
>   from DBA_TAB_PARTITIONS
>  where TABLE_OWNER = 'ASPP_DBA'
>and TABLE_NAME  = W_TABELA );
>   --
>   -- Transforma o HIGH_VALUE em 'date'
>   execute immediate 'select ' || W_HIGH_VALUE || ' from dual' into 
> W_DATA_HIGH_VALUE;
>   --
>   -- Compõe o nome da nova partição
>   W_PART_NOME_NOVO  := to_char( W_DATA_HIGH_VALUE, 'MONYY' ) || W_SUFIXO_PART;
>   --
>   -- Montagem e execução do comando de split
>   W_COMANDO_SPLIT := 'alter table ASPP_DBA.' || W_TABELA || ' split partition 
> DATI' || W_SUFIXO_PART || ' at ( ' ||
>  'to_date( ''' || to_char( add_months( W_DATA_HIGH_VALUE, 
> 1 ), 'dd/mm/' ) || ''', ''DD/MM/'' ) ) ' ||
>  'into ( ' || W_PART_NOME_NOVO || ', DATI' || 
> W_SUFIXO_PART || ' )';
>   dbms_output.put_line( W_COMANDO_SPLIT );
>   --execute immediate W_COMANDO_SPLIT;
> end;
> /
> exit
> !EOF
> 
> 
> 
> 
> 
> 
> 
> 
> 
> --- Em oracle_br@yahoogrupos.com.br, "Aparecido"  escreveu
> >
> > Muito bom seu artigo Ivan!
> > 
> > Já está na biblioteca, rss
> > 
> > Tenho mais uma dúvida, tenho uma tabela particionada por mês que pararam de 
> > dar manutenção.
> > 
> > O que ocorre é que tenho que criar as partições pra dar andamento no que 
> > foi feito anteriormente, porém tenho mais de 3 anos de dados não 
> > particionado.
> > 
> > Estou estudando a documentação de particionamento do 9i e até o momento só 
> > achei um ADD PARTITION...
> > 
> > A pergunta é: 
> > 
> > É transparente eu ir adicionando as partições na Tabela conforme está no 
> > manual? Ou seja, é só dar um ALTER TABLE ... ADD PARTITION... e depois 
> > reconstuir os indices? Ou existe alguma observação?
> > 
> > Obrigado a todos!
> > 
> > Cido
> > 
> > --- Em oracle_br@yahoogrupos.com.br, Ivan Ricardo Schuster  
> > escreveu
> > >
> > > Aparecido,
> > > 
> > > Uma forma mais eficiente de particionar esta tabela é adicionar este
> > > campo e usar o "exchange partition".
> > > 
> > > Escrevi algo sobre isso ha um tempo atras no link abaixo, acredito que
> > > funcione 100% no Oracle 9i, mas é bom testar:
> > > 
> > > http://ivanschuster.wordpress.com/2010/06/04/utilizando-exchange-partition/
> > > 
> > > Abraço
> > > 
> > > 2010/8/27 Aparecido :
> > > > Obrigado pela resposta Amigo!
> > > >
> > > > Então, é exatamente isso, adicionar um campo somente para particionar 
> > > > uma tabela, e este campo seria adicionado na aplicação com o sysdate 
> > > > (por exemplo) pra cair na partição correta.
> > > >
> > > > A pergunta foi porque na tabela não tenho nenhum campo data.
> > > >
> > > > Valeu.
> > > >
> > > > Abraço
> > > >
> > > > --- Em oracle_br@yahoogrupos.com.br, Duilio Bruniera Junior  
> > > > escreveu
> > > >>
> > > >> Então amigão a parada é assim !
> > > >> O r

[oracle_br] Re: PARTICIONAMENTO DE TABELAS 9i

2010-08-30 Por tôpico interessado60
Bom dia

sempre que tive este problema, executei o comando abaixo:

ALTER TABLE DWH.DW_A_BASE_DIARIA SPLIT PARTITION MES_200405_E_ACIMA 
AT   (TO_DATE(' 2004-06-01 00:00:00', 'S-MM-DD HH24:MI:SS', 
'NLS_CALENDAR=GREGORIAN')) 
INTO (PARTITION MES_200405  pctused 98 pctfree 1 TABLESPACE  
TSD_DW_A_BASE_DIARIA_MAI04, 
  PARTITION RESTANTE_MAXVALUE  pctused 98 pctfree 1 TABLESPACE  
TBL_DWH_MAXVALUE )  
parallel (degree 16);

##
  para voce tirar a duvida de quem é quem, veja p PL abaixo:
##

# Procedimento de split da partição MAXVALUE, gerando a nova partição.
#

# Garante que o nome da nova partição vai usar a descrição do mês em inglês
export NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252
export ORACLE_SID=ASPP1

sqlplus '/ as sysdba' << !EOF
declare
  --
  W_TABELA  varchar2( 30 ) := '${1}';  -- Nome da tabela a ser 
processada
  W_SUFIXO_PART varchar2( 30 ) := '${2}';  -- Suxifo para compor o nome das 
partições
  W_PARTITION_NAME  varchar2( 30 );-- Nome da última partição
  W_HIGH_VALUE  varchar2( 300 );   -- Valor de HIGH_VALUE da última 
partição (antes da MAXVALUE)
  W_DATA_HIGH_VALUE date;  -- Valor do HIGH_VALUE em 
formato data
  W_PART_NOME_NOVO  varchar2( 30 );-- Nome da nova partição
  W_COMANDO_SPLIT   varchar2( 300 );   -- Statement de split para uso 
com 'execute immediate'
  --
begin
  --
  -- Montagem do nome da nova partição
  --
  -- Descobre o nome e o high_value da última partição (antes da MAXVALUE)
  select PARTITION_NAME, HIGH_VALUE
into W_PARTITION_NAME, W_HIGH_VALUE
from DBA_TAB_PARTITIONS
   where TABLE_OWNER= 'ASPP_DBA'
 and TABLE_NAME = W_TABELA
 and PARTITION_POSITION = ( select max( PARTITION_POSITION ) - 1
  from DBA_TAB_PARTITIONS
 where TABLE_OWNER = 'ASPP_DBA'
   and TABLE_NAME  = W_TABELA );
  --
  -- Transforma o HIGH_VALUE em 'date'
  execute immediate 'select ' || W_HIGH_VALUE || ' from dual' into 
W_DATA_HIGH_VALUE;
  --
  -- Compõe o nome da nova partição
  W_PART_NOME_NOVO  := to_char( W_DATA_HIGH_VALUE, 'MONYY' ) || W_SUFIXO_PART;
  --
  -- Montagem e execução do comando de split
  W_COMANDO_SPLIT := 'alter table ASPP_DBA.' || W_TABELA || ' split partition 
DATI' || W_SUFIXO_PART || ' at ( ' ||
 'to_date( ''' || to_char( add_months( W_DATA_HIGH_VALUE, 1 
), 'dd/mm/' ) || ''', ''DD/MM/'' ) ) ' ||
 'into ( ' || W_PART_NOME_NOVO || ', DATI' || W_SUFIXO_PART 
|| ' )';
  dbms_output.put_line( W_COMANDO_SPLIT );
  --execute immediate W_COMANDO_SPLIT;
end;
/
exit
!EOF









--- Em oracle_br@yahoogrupos.com.br, "Aparecido"  escreveu
>
> Muito bom seu artigo Ivan!
> 
> Já está na biblioteca, rss
> 
> Tenho mais uma dúvida, tenho uma tabela particionada por mês que pararam de 
> dar manutenção.
> 
> O que ocorre é que tenho que criar as partições pra dar andamento no que foi 
> feito anteriormente, porém tenho mais de 3 anos de dados não particionado.
> 
> Estou estudando a documentação de particionamento do 9i e até o momento só 
> achei um ADD PARTITION...
> 
> A pergunta é: 
> 
> É transparente eu ir adicionando as partições na Tabela conforme está no 
> manual? Ou seja, é só dar um ALTER TABLE ... ADD PARTITION... e depois 
> reconstuir os indices? Ou existe alguma observação?
> 
> Obrigado a todos!
> 
> Cido
> 
> --- Em oracle_br@yahoogrupos.com.br, Ivan Ricardo Schuster  
> escreveu
> >
> > Aparecido,
> > 
> > Uma forma mais eficiente de particionar esta tabela é adicionar este
> > campo e usar o "exchange partition".
> > 
> > Escrevi algo sobre isso ha um tempo atras no link abaixo, acredito que
> > funcione 100% no Oracle 9i, mas é bom testar:
> > 
> > http://ivanschuster.wordpress.com/2010/06/04/utilizando-exchange-partition/
> > 
> > Abraço
> > 
> > 2010/8/27 Aparecido :
> > > Obrigado pela resposta Amigo!
> > >
> > > Então, é exatamente isso, adicionar um campo somente para particionar uma 
> > > tabela, e este campo seria adicionado na aplicação com o sysdate (por 
> > > exemplo) pra cair na partição correta.
> > >
> > > A pergunta foi porque na tabela não tenho nenhum campo data.
> > >
> > > Valeu.
> > >
> > > Abraço
> > >
> > > --- Em oracle_br@yahoogrupos.com.br, Duilio Bruniera Junior  
> > > escreveu
> > >>
> > >> Então amigão a parada é assim !
> > >> O range partition, ou (Particionamento por intervalo),  tem como 
> > >> principal
> > >> função é dividir uma tabela em intervalos de tempo ou numéricos.
> > >>
> > >> Agora deixa eu ver se entendi, oque voce quer fazer é criar um campo 
> > >> data ha
> > >> mais nessa tabela, jogar um valor sysdate ou uma sequence nesse campo pra
> > >> poder particionar a tabela, é isso ?
> > >>

[oracle_br] Re: PARTICIONAMENTO DE TABELAS 9i

2010-08-28 Por tôpico Aparecido
Muito bom seu artigo Ivan!

Já está na biblioteca, rss

Tenho mais uma dúvida, tenho uma tabela particionada por mês que pararam de dar 
manutenção.

O que ocorre é que tenho que criar as partições pra dar andamento no que foi 
feito anteriormente, porém tenho mais de 3 anos de dados não particionado.

Estou estudando a documentação de particionamento do 9i e até o momento só 
achei um ADD PARTITION...

A pergunta é: 

É transparente eu ir adicionando as partições na Tabela conforme está no 
manual? Ou seja, é só dar um ALTER TABLE ... ADD PARTITION... e depois 
reconstuir os indices? Ou existe alguma observação?

Obrigado a todos!

Cido

--- Em oracle_br@yahoogrupos.com.br, Ivan Ricardo Schuster  
escreveu
>
> Aparecido,
> 
> Uma forma mais eficiente de particionar esta tabela é adicionar este
> campo e usar o "exchange partition".
> 
> Escrevi algo sobre isso ha um tempo atras no link abaixo, acredito que
> funcione 100% no Oracle 9i, mas é bom testar:
> 
> http://ivanschuster.wordpress.com/2010/06/04/utilizando-exchange-partition/
> 
> Abraço
> 
> 2010/8/27 Aparecido :
> > Obrigado pela resposta Amigo!
> >
> > Então, é exatamente isso, adicionar um campo somente para particionar uma 
> > tabela, e este campo seria adicionado na aplicação com o sysdate (por 
> > exemplo) pra cair na partição correta.
> >
> > A pergunta foi porque na tabela não tenho nenhum campo data.
> >
> > Valeu.
> >
> > Abraço
> >
> > --- Em oracle_br@yahoogrupos.com.br, Duilio Bruniera Junior  
> > escreveu
> >>
> >> Então amigão a parada é assim !
> >> O range partition, ou (Particionamento por intervalo),  tem como principal
> >> função é dividir uma tabela em intervalos de tempo ou numéricos.
> >>
> >> Agora deixa eu ver se entendi, oque voce quer fazer é criar um campo data 
> >> ha
> >> mais nessa tabela, jogar um valor sysdate ou uma sequence nesse campo pra
> >> poder particionar a tabela, é isso ?
> >>
> >> se for isso o primeiro passo é fazer um alter table add novo campo e
> >> carregar os valores depois criar a tabela_com_particionamento, depois voce
> >> pode fazer um "INSERT INTO . (select *
> >> from );" depois faz um rename na tabela.
> >>
> >> mais voce tem que analizar o tamanho e se a movimentação tiver que ser a
> >> quente é um pouco mais complicado.
> >>
> >> Em 26 de agosto de 2010 19:59, Aparecido  escreveu:
> >>
> >> >
> >> >
> >> > Olá pessoal.
> >> >
> >> > Alguém sabe se é possível criar um campo do tipo data somente para fazer
> >> > particionamento por range??
> >> >
> >> > Obrigado pela atenção.
> >> >
> >> > Att.
> >> >
> >> > Cido
> >> >
> >> >
> >> >
> >>
> >>
> >> [As partes desta mensagem que não continham texto foram removidas]
> >>
> >
> >
> >
> >
> > 
> >
> > --
> >>Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira 
> >>responsabilidade de seus remetentes.
> > Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/
> > --
> >>Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure 
> >>» Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: 
> >>http://www.oraclebr.com.br/
> > 
> >  Links do Yahoo! Grupos
> >
> >
> >
> 
> 
> 
> -- 
> Ivan Ricardo Schuster
> OCP 10g/11g
> OCE RAC 10g/Linux
>



Re: [oracle_br] Re: PARTICIONAMENTO DE TABELAS 9i

2010-08-27 Por tôpico Ivan Ricardo Schuster
Aparecido,

Uma forma mais eficiente de particionar esta tabela é adicionar este
campo e usar o "exchange partition".

Escrevi algo sobre isso ha um tempo atras no link abaixo, acredito que
funcione 100% no Oracle 9i, mas é bom testar:

http://ivanschuster.wordpress.com/2010/06/04/utilizando-exchange-partition/

Abraço

2010/8/27 Aparecido :
> Obrigado pela resposta Amigo!
>
> Então, é exatamente isso, adicionar um campo somente para particionar uma 
> tabela, e este campo seria adicionado na aplicação com o sysdate (por 
> exemplo) pra cair na partição correta.
>
> A pergunta foi porque na tabela não tenho nenhum campo data.
>
> Valeu.
>
> Abraço
>
> --- Em oracle_br@yahoogrupos.com.br, Duilio Bruniera Junior  
> escreveu
>>
>> Então amigão a parada é assim !
>> O range partition, ou (Particionamento por intervalo),  tem como principal
>> função é dividir uma tabela em intervalos de tempo ou numéricos.
>>
>> Agora deixa eu ver se entendi, oque voce quer fazer é criar um campo data ha
>> mais nessa tabela, jogar um valor sysdate ou uma sequence nesse campo pra
>> poder particionar a tabela, é isso ?
>>
>> se for isso o primeiro passo é fazer um alter table add novo campo e
>> carregar os valores depois criar a tabela_com_particionamento, depois voce
>> pode fazer um "INSERT INTO . (select *
>> from );" depois faz um rename na tabela.
>>
>> mais voce tem que analizar o tamanho e se a movimentação tiver que ser a
>> quente é um pouco mais complicado.
>>
>> Em 26 de agosto de 2010 19:59, Aparecido  escreveu:
>>
>> >
>> >
>> > Olá pessoal.
>> >
>> > Alguém sabe se é possível criar um campo do tipo data somente para fazer
>> > particionamento por range??
>> >
>> > Obrigado pela atenção.
>> >
>> > Att.
>> >
>> > Cido
>> >
>> >
>> >
>>
>>
>> [As partes desta mensagem que não continham texto foram removidas]
>>
>
>
>
>
> 
>
> --
>>Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira 
>>responsabilidade de seus remetentes.
> Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/
> --
>>Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » 
>>Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: 
>>http://www.oraclebr.com.br/
> 
>  Links do Yahoo! Grupos
>
>
>



-- 
Ivan Ricardo Schuster
OCP 10g/11g
OCE RAC 10g/Linux


[oracle_br] Re: PARTICIONAMENTO DE TABELAS 9i

2010-08-27 Por tôpico Aparecido
Obrigado pela resposta Amigo!

Então, é exatamente isso, adicionar um campo somente para particionar uma 
tabela, e este campo seria adicionado na aplicação com o sysdate (por exemplo) 
pra cair na partição correta.

A pergunta foi porque na tabela não tenho nenhum campo data.

Valeu.

Abraço

--- Em oracle_br@yahoogrupos.com.br, Duilio Bruniera Junior  
escreveu
>
> Então amigão a parada é assim !
> O range partition, ou (Particionamento por intervalo),  tem como principal
> função é dividir uma tabela em intervalos de tempo ou numéricos.
> 
> Agora deixa eu ver se entendi, oque voce quer fazer é criar um campo data ha
> mais nessa tabela, jogar um valor sysdate ou uma sequence nesse campo pra
> poder particionar a tabela, é isso ?
> 
> se for isso o primeiro passo é fazer um alter table add novo campo e
> carregar os valores depois criar a tabela_com_particionamento, depois voce
> pode fazer um "INSERT INTO . (select *
> from );" depois faz um rename na tabela.
> 
> mais voce tem que analizar o tamanho e se a movimentação tiver que ser a
> quente é um pouco mais complicado.
> 
> Em 26 de agosto de 2010 19:59, Aparecido  escreveu:
> 
> >
> >
> > Olá pessoal.
> >
> > Alguém sabe se é possível criar um campo do tipo data somente para fazer
> > particionamento por range??
> >
> > Obrigado pela atenção.
> >
> > Att.
> >
> > Cido
> >
> >  
> >
> 
> 
> [As partes desta mensagem que não continham texto foram removidas]
>