Pular para o conteúdo
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #94197
    Thiago Vilhena
    Participante

      Boa 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…

      #94199
      Thiago Vilhena
      Participante

        BELEZA 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 =D

        #94202
        VitorLeandro
        Participante

          Blz 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í…

          #94229
          Thiago Vilhena
          Participante

            Oi 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 rsrs

            #94230
            ramasine
            Participante

              Thiago, vale a pena dar uma olhada na dbms_redefinition !!

              #94232
              VitorLeandro
              Participante

                Saquei, 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!

                #94251
                vieri
                Participante

                  Muito 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.

                Visualizando 7 posts - 1 até 7 (de 7 do total)
                • Você deve fazer login para responder a este tópico.