Pular para o conteúdo
  • Este tópico contém 8 respostas, 3 vozes e foi atualizado pela última vez 16 anos, 2 meses atrás por jspaulonci.
Visualizando 9 posts - 1 até 9 (de 9 do total)
  • Autor
    Posts
  • #91951
    jspaulonci
    Participante

      Bom dia pessoal, estou começando a brincar com particionamento e quero fazer uma pergunta.

      Eu sempre devo deixar uma partição na tabela com o MAX VALUE, para que o usuário não tenha erros do tipo

      SQL> Insert Into numbers (qty,name) Values (2300,’ll’);
      Insert Into numbers (qty,name) Values (2300,’ll’)
      *
      ERRO na linha 1:
      ORA-01438: value larger than specified precision allowed for this column

      Esse erro eu simulei pois a tabela tabela não deixou eu inserir o valor 2300 para coluna qty, pois ela possui só uma partição e ela preve um valor abaixo de 101.

      SQL> Insert Into numbers (qty,name) Values (23,’ll’);

      1 linha criada.

      SQL> commit;

      Commit concluído.

      Obrigado
      João Paulo

      #91972
      Marcio68Almeida
      Participante

        Se você não criar partições que comportem os dados a ser inseridos, certamente terá esse tipo de erro.
        O normal é que se crie partições para range de valores conhecidos.
        Por exemplo, se você particionar por ano, e não criar uma partição 2010, certamente terá problemas…

        #91973
        jspaulonci
        Participante

          Primeiramente, muito obrigado Marcio, gostaria de postar mais algumas dúvidas.

          E possível utilizar dois métodos de particionamento na mesma tabela ?
          Só o compose partition faz isso ?

          É possível transformar uma partição de MAXVALUE para um outro valor no RANGE PARTITION ?

          No list partition é possível aumentar uma nova tablespace sem dropar a tabela e recria-la novamente ?

          Obrigado

          #91989
          VitorLeandro
          Participante

            Bom dia Amigo, vamos ver se consigo te ajudar.

            Primeiramente é possível sim utilizar dois tipos de partição numa mesma tabela como você informou, mas seria uma partição tipo x e uma subpartição tipo x ou y.

            Você pode por exemplo criar uma tabela particionada por Range e subparticionada por list..
            EX:
            CREATE TABLE TESTE
            ( CODIGO INTEGER
            STATUS VARCHAR(1 BYTE)
            )

            PARTITION BY RANGE (CODIGO)
            SUBPARTITION BY LIST(STATUS)

            (
            PARTITION PART_1 VALUES LESS THAN(‘2000’)
            (SUBPARTITION SUBP1_STATS VALUES (‘S’),
            SUBPARTITION SUBP1_STATN VALUES (‘N’)),
            PARTITION PART_2 VALUES LESS THAN(‘3000’)
            (SUBPARTITION SUBP2_STATS VALUES (‘S’),
            SUBPARTITION SUBP2_STATN VALUES (‘N’)),
            PARTITION PART_3 VALUES LESS THAN(‘4000’)
            (SUBPARTITION SUBP3_STATS VALUES (‘S’),
            SUBPARTITION SUBP3_STATN VALUES (‘N’)),
            PARTITION PART_4 VALUES LESS THAN(‘MAXVALUE’)
            (SUBPARTITION SUBP4_STATS VALUES (‘S’),
            SUBPARTITION SUBP4_STATN VALUES (‘N’))
            )

            Existem N tipos de particionamento, principalmente no 11G. Seria muito interessante você verificar o manual da sua versão e verificar todas as opções existentes.

            Sobre alterar uma partição, você pode fazer um alter table e adicionar partições intermediárias, antes do MAXVALUE. Deixando essa partição como está. Será mais rápido!

            ALTER TABLE TESTE
            ADD PARTITION PART_5 VALUES LESS THAN(‘5000’)
            (ADD SUBPARTITION SUBP4_STATS VALUES (‘S’),
            ADD SUBPARTITION SUBP4_STATN VALUES (‘N’)),

            Sobre o Listpartition aumentar uma tablespace eu não intendi! Mas se você quizer mudar uma partição de tablespace você faz um alter table, move partition..

            EX: alter table TESTE
            move subpartition PART_4 tablespace TBS

            #91990
            jspaulonci
            Participante

              Vito, obrigado pela explicações, foram de muita valia.

              Quanto a pergunta que fiz e você não entendeu eu quis dizer o seguinte.

              Eu começo um projeto, preciso particionar uma tabela pelo tipo HASH , e disponibilizo 4 tablespaces para essa tabela. depois de um ano eu descubro que se eu colocar mais 2 tablespaces para o particionamento dessa tabela, terei ganho de performance , como eu faria para adicionar essas duas novas tablespaces ?

              Obrigado
              Spaulonci

              #91991
              VitorLeandro
              Participante

                Ok, só fazendo uma correção.

                Você pode criar partições de múltiplas colunas (Multiple Column Partition), porem deve ser do mesmo tipo.

                EX:

                CREATE TABLE TESTE
                ( CODIGO INTEGER
                TIPO INTEGER
                )

                PARTITION BY RANGE (CODIGO, TIPO)

                (
                PARTITION PART_1 VALUES LESS THAN(‘2000’,’1’)
                PARTITION PART_1 VALUES LESS THAN(‘2000’,’2’)
                PARTITION PART_2 VALUES LESS THAN(‘3000’,’1’)
                PARTITION PART_2 VALUES LESS THAN(‘3000’,’2’)
                PARTITION PART_3 VALUES LESS THAN(‘4000’,’1’)
                PARTITION PART_3 VALUES LESS THAN(‘4000’,’2’)
                PARTITION PART_4 VALUES LESS THAN(‘MAXVALUE’,’1’)
                PARTITION PART_4 VALUES LESS THAN(‘MAXVALUE’,’2’)
                )

                Essa funcionalidade eu já testei no 11G R2, não sei se funciona em outras versões.

                Vamos lá, é mais ou menos o que eu expliquei. Uma partição só pode ficar em uma única tablespace! Então você precisará escolher as partições que você deseja e então movê-las para as novas tablespaces, comando como eu expliquei acima.

                Alter table xxx

                move partition partXX tablespace tbs…

                Lembrando que o move, efetua um lock na partição, então sugiro que você faça isso numa manutenção programada!

                Outro detalhe, se você começar espalhar de mais os seus dados e partições em múltiplas tablespaces esperando performance, você provavelmente terá se utilizar estorages antigas em modo filesystem. Daí, você deverá ter tempo de sobre pra ficar alterando objetos de tablespace para outra… Uma solução simples seria migrar seu ambiente parar ASM, que efetua o balanceamente de carga e performance em um nível mais baixo da aplicação. Se você utiliza as novas teconologias de storages virtualizadas (EVA, EXADATA e outras) a própria storage faz esse papel, sem a sua interferência!!

                #91992
                jspaulonci
                Participante

                  Certo, Vitor, eu uso ASM , estou em RAC 10.2.0.3.0, você acha que não precisa ficar espalhando em vários tablespaces ?

                  #91994
                  VitorLeandro
                  Participante

                    Isso depende de o ASM está configurado. Os datafiles destas tablespaces estão em um mesmo diskgroup? Mesma LUN? Se estiverem, acho que não vale a pena!

                    Primeiramente, veja quantos diskgroups existem…
                    SELECT INST_ID, GROUP_NUMBER, NAME, BLOCK_SIZE, STATE, TYPE, TOTAL_MB, FREE_MB, USABLE_FILE_MB
                    FROM GV$ASM_DISKGROUP

                    Em seguida, veja onde seus datafiles estão:
                    SELECT tablespace_name, status,file_name FROM DBA_DATA_FILES

                    No nome do datafile, você tem em qual diskgoup ele está!

                    Isso é só pra se ter uma idéia, pois é preciso checar tambem na storage quantos diskgroups existem, se cada disk group da storage é um diskgroup no ASM…

                    Já estive em uma empresa onde foi colocado 10 discos formando um diskgroup e apenas uma LUN (volume lógico) na storage e apenas um diskgroup no ASM… Nesse caso, a storage quem faria o balanceamento pois o ASM enxergará tudo como se fosse apenas um disco.

                    As storages atuais fazem isso por padrão, onde você informa o tamanho do volume para determinado host e ela se encarrega de gravar isso em um grupo de discos interno, balanceando automaticamente a carga. A cada disco que você insere na storage, ela realiza o balanceamento dos dados entre os discos e a capacidade de I/O da storage vai aumentando a medida que são colocados mais discos.

                    Isso é muita informação e o ADDM pode te dar uma Luz. Dê uma olhada no ADDM e verifique se existe algum alerta tipo ” I/O Throughput”…

                    SELECT b.owner, b.task_id, b.task_name, b.execution_name, b.finding_id,
                    b.finding_name, b.TYPE, b.type_id, b.PARENT, b.object_id,
                    b.impact_type, b.impact, b.MESSAGE, b.more_info, b.filtered, b.flags,
                    a.database_time, a.active_sessions, a.perc_active_sess,
                    a.is_aggregate AS is_aggregate, a.meter_level
                    FROM SYS.wri$_adv_addm_fdg a, dba_advisor_findings b
                    WHERE b.task_id = a.task_id
                    AND b.finding_id = a.finding_id
                    AND b.finding_name LIKE ‘%Throughput de E/S%’
                    ORDER BY task_id DESC

                    Através do select acima, pegue o TASK_NAME e pesquise através do DB Control/ADDM os eventuais alertas e problemas informados sobre Throughput.

                    Isso pode revelar um pouco sobre diferenças de Throughput que estão denegrindo a performance em alguns objetos.

                    #91997
                    jspaulonci
                    Participante

                      Muito Obrigado Vitor….valeu mesmo

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