- Este tópico contém 6 respostas, 4 vozes e foi atualizado pela última vez 15 anos, 9 meses atrás por
vieri.
-
AutorPosts
-
25 de maio de 2010 às 12:31 am #94197
Thiago Vilhena
ParticipanteBoa tarde pessoal, seguinte estou tentando fazer uma proc, que verifica se existe um particionamento, caso nao exista ela cria e caso exista ela simplesmente diz que existe e nao faz nada,
entao dai ta meio assim
só que ta caindo na exception alguem ajuda??
CREATE OR REPLACE PROCEDURE THIAGO_PARTITION
IS
VERIFICA VARCHAR(1);
PARTICAO varchar2(40);
BEGIN
VERIFICA := 'N';
PARTICAO := 'COD';
SELECT 'S' INTO VERIFICA FROM ALL_TAB_PARTITIONS
WHERE
PARTITION_NAME = PARTICAO;
IF
VERIFICA = 'N'
THEN
dbms_output.put_line('EXECUTA PARTITION ' || verifica);
ELSE
dbms_output.put_line('PARTITION EXISTE ' || verifica);
END IF;
EXCEPTION
WHEN
no_data_found THEN
dbms_output.put_line('ENTROU NA EXCECAO');
END;
/
vlwwwww…
25 de maio de 2010 às 1:51 am #94199Thiago Vilhena
ParticipanteBELEZA PESSOAL.. MEIO QUE CONSSEGUI FAZER A VALIDAÇÃO FICOU ASSIM
CREATE OR REPLACE PROCEDURE THIAGO
IS
ANO_MES CHAR (6);
ANO NUMBER(4);
MES NUMBER(2);
VERIFICA INTEGER;
PARTICAO varchar2(15);
BEGIN
VERIFICA := 0 ;
SELECT TO_CHAR(SYSDATE,'YYYYMM') INTO ANO_MES FROM DUAL;
ANO:= SUBSTR(ANO_MES,1,4);
MES := SUBSTR(ANO_MES,5,2);
IF MES = 12
THEN
ANO := ANO + 1;
MES := 01;
ELSE
MES := MES + 1;
END IF;
DBMS_OUTPUT.PUT_LINE('ANTES SELECT');
PARTICAO := 'COD';
SELECT COUNT(*) INTO VERIFICA FROM ALL_TAB_PARTITIONS
WHERE
PARTITION_NAME = PARTICAO;
DBMS_OUTPUT.PUT_LINE('DEPOIS DO SELECT');
IF
VERIFICA > 0
THEN
DBMS_OUTPUT.PUT_LINE('NAO EXECUTA');
ELSE
DBMS_OUTPUT.PUT_LINE('EXECUTA');
END IF;
DBMS_OUTPUT.PUT_LINE('ANO MES ' || ANO_MES);
DBMS_OUTPUT.PUT_LINE('ANO'||TO_CHAR(ANO));
DBMS_OUTPUT.PUT_LINE('MES' || TO_CHAR(MES));
--PARTICAO := 'DAT_LOG_'||ano||'_'|| lpad(mes,2,0);
DBMS_OUTPUT.PUT_LINE('PARTICAO' || PARTICAO);
EXCEPTION
WHEN
no_data_found THEN
VERIFICA := 'N' ;
dbms_output.put_line('NAO EXISTE PARTITION ' || VERIFICA);
end;
/AGORA EU VOU TENTAR FAZER COM QUE ESSA PROCEDURE LEIA 14 TABELAS, SAO 14 TABELAS QUE DEVEM SER PARTICIONADAS
SE ALGUEM TIVER UMA IDEIA =D25 de maio de 2010 às 5:02 am #94202VitorLeandro
ParticipanteBlz Thiago,
Cara só não entendi direito o que você quer fazer. Você está montando uma procedure para particionar automaticamente as tabelas? Encontrar as não particionadas?
Bem, pra particionamento eu utilizaria o create table as select se puder dar uma paradinha no banco, mas se não, pesquise sobre o DBMS_REDEFINITION. Com ele, você altera a estrutura da tabela, sem nenhuma indisponibilidade.
Explica melhor aí…
25 de maio de 2010 às 11:34 pm #94229Thiago Vilhena
ParticipanteOi Vitor, Po manuh, tipo assim eu tenho 14 tabelas que devem ser criado todo mes uma partição, entao pensei po eu poderia fazer uma procedure que roda-se todos os dias e verifica-se se as 14 tabelas ja estavao particionadas pro mes ou nao, caso nao estivessem a procedure executava o particionamento =D
praticidade rsrs26 de maio de 2010 às 12:33 am #94230ramasine
ParticipanteThiago, vale a pena dar uma olhada na dbms_redefinition !!
26 de maio de 2010 às 12:43 am #94232VitorLeandro
ParticipanteSaquei, quer particionar por range de data (Mês) e ao final de cada Mês criar uma nova partição automaticamente ao executar a procedure…
Bom, automatizar particionamento eu nunca fiz, pois pode esbarrar em algumas inviabilidades técnicas, alem de você não ve p que realmente aconteceu. Segue um exemplo:
- A criação de nova partição marcará todos os indexes globais como UNUSABLE, e todas as querys que utilizam esses indexes irão fazer FULL SCAN. Será necessário fazer um rebuild a cada inclusão de partição.
- Sugiro criar todos os indexes como locais, claro, os que fazem parte da chave da partição. Isso quer dizer que toda vez que uma nova partição for criada, uma nova partição do index também será criada automaticamente! Mas com certeza nem todos os indexes dessa tabela poderão ser locais.. unique…
[b]
nota:
Se você utilizar o 11G, pode fazer uso do partitioning interval, onde você fala o intervalo das partições e estas são automaticamente criadas a partir da necessidade dos dados inseridos.
[/b]Sujestão:
Particione as tabelas por RANGE de data, com intervalos de 6 em 6 meses e os crie levando em consideração uns 10 anos pra frente! Não se esqueça do MAXVALUE! Se essas datas forem imutaveis, tipo não acontece update nessas datas, (ex: data_geração_nota_fiscal) tambem estabeleça, você mesmo uma rotina de compressão das partições muito antigas. Vai economizar muito espaço e tempo nos selects(redução de I/O).Agende uma janela de manutenção pra fazer isso.
Se sua tabela é tão gigante assim para ter que particionar por mês, imagino que seus indexes sejam enormes. Quanto será o tempo de rebuild? Tablespace TEMP? Indisponibilidade?
Certas coisas, faça você mesmo e com muito planejamento!
27 de maio de 2010 às 12:32 am #94251vieri
ParticipanteMuito boa a sugestão do vitor de já deixar 10 anos de partições criadas,
evita re-trabalhoes e manutenções.
E provavelmente outro DBA que irá fazer!! rsrs…brincadeiras a parte, achoque mês a mês é excesso de preciocismo,
ainda mas automáticamente. -
AutorPosts
- Você deve fazer login para responder a este tópico.