Pular para o conteúdo
Visualizando 8 posts - 1 até 8 (de 8 do total)
  • Autor
    Posts
  • #91724
    ricardo80
    Participante

      Olá pessoal, sou novato com Oracle, e estou criando um sistema onde existe tabelas com chave primária, onde as mesmas são auto numericas. Queria saber qual a melhor tecnica em relação a performance, se seria utilizando MAX ou sequence. caso eu utilize o sequence, eu colocaria a chamada do nextvalue no próprio insert e não com uma trigger, como vários indicam.

      Outra dúvida, é quanto a modelagem mesmo, eu utilizo em meu projeto o padrão onde toda chave primária é única e sequencial, assim facilita bastante o trabalho da codificação. Vocês tem algo contra a utilização de um sequence para cada tabela para todas as tabelas terem uma chave auto numerica?

      []’s
      Ricardo Carvalho

      #91726
      Avatar photoRegis Araujo
      Participante

        Salve Ricardo, boa tarde!

        Bom, eu sempre utilizo Sequence, acho mais pratico, de qualquer maneira haverá o fator performance, pois utilizar o MAX+1 seria logicamente mais correto, mas imagina sua tabela com uns 10 milhoes de registro e vc sempre dando um MAX+1, no começo, vai ser tranquilo, mas e depois? Como será?

        Ja a sequence é mais pratica, pois não vai precisar varrer a tabela para verificar qual o maior valor, este valor já fica armazenado e quando vc utiliza o nextval ele apenas pega o valor já armazenado e te devolve este valor…

        Espero que lhe ajude.

        Abraços..!

        #91732
        hudsona
        Participante

          E complementando o que o nosso amigo disse,

          Qualquer problema com a sequence é só recria-la com o valor que deseja.

          #91738
          Avatar photoLeonardo Litz
          Participante

            Eu prefiro sequence, alem de nao ter que varrer a tabela no select count, as sequences ja ficam instanciadas em memoria quando o banco e montado. Oque a torna muito rapido.

             Vlw Leonardo Litz
            
            #91739
            burga
            Participante

              O problema com o MAX é que duas ou mais sessões podem calcular o MAX ao mesmo tempo, e, sendo assim, recuperar o mesmo número para o preenchimento do campo de chave primária. Aí ocorre de uma transação rodar um insert sem problemas e todas as outras retornando exceção.

              O mais recomendado é usar sequences mesmo, tanto pela segurança de que nunca um número vai se repetir, quanto pela performance que, como os colegas já falaram, o banco não vai precisar sempre calcular o MAX+1.

              #91741
              fsitja
              Participante

                [quote=”burga”:20qlrv1s]O problema com o MAX é que duas ou mais sessões podem calcular o MAX ao mesmo tempo, e, sendo assim, recuperar o mesmo número para o preenchimento do campo de chave primária. Aí ocorre de uma transação rodar um insert sem problemas e todas as outras retornando exceção.

                O mais recomendado é usar sequences mesmo, tanto pela segurança de que nunca um número vai se repetir, quanto pela performance que, como os colegas já falaram, o banco não vai precisar sempre calcular o MAX+1.[/quote]

                O Burga está totalmente correto. Select MAX para chave primária não suporta o mínimo requisito de concorrência, o que vai de encontro com o propósito de se ter um banco de dados em primeiro lugar.

                Use sequence, obviamente uma para cada tabela/chave. Eu prefiro evitar colocar em triggers a atribuição da sequence, para deixar à mostra, explícito.

                Quanto a usar uma sequence para PK de todas tabelas como surrogate key, é uma boa prática, mas você deve lembrar de sempre usar com Unique Keys nas chaves conceituais, para garantir a consistência dos seus dados.

                #91754
                ricardo80
                Participante

                  Obrigado a todas as respostas. Foi de grande ajuda, e como recomendado, vou utilizar o SEQUENCE mesmo, e chamando o nextvalue como subquery no insert.
                  Novamente obrigado a todos, já me sinto bem-vindo no fórum.

                  #91756
                  burga
                  Participante

                    [quote=”ricardo80″:2d0522aa]e chamando o nextvalue como subquery no insert.[/quote]

                    Não sei se entendi bem o que você disse sobre subquery, mas interpretando literalmente, o nextval não precisa ser chamado dentro de uma subquery no insert…

                    Você pode fazer o seguinte:

                    INSERT INTO TABELA (CAMPO1, CAMPO2, CAMPO3)
                    VALUES (SEQUENCIA.NEXTVAL, 'VALOR2', 'VALOR3');

                    😀

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