- Este tópico contém 7 respostas, 6 vozes e foi atualizado pela última vez 16 anos, 3 meses atrás por
burga.
-
AutorPosts
-
23 de dezembro de 2009 às 12:10 am #91724
ricardo80
ParticipanteOlá 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 Carvalho23 de dezembro de 2009 às 12:26 am #91726Regis Araujo
ParticipanteSalve 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..!
23 de dezembro de 2009 às 12:55 am #91732hudsona
ParticipanteE complementando o que o nosso amigo disse,
Qualquer problema com a sequence é só recria-la com o valor que deseja.
23 de dezembro de 2009 às 1:30 am #91738Leonardo Litz
ParticipanteEu 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 Litz23 de dezembro de 2009 às 1:49 am #91739burga
ParticipanteO 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.
23 de dezembro de 2009 às 5:34 am #91741fsitja
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.
23 de dezembro de 2009 às 5:23 pm #91754ricardo80
ParticipanteObrigado 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.23 de dezembro de 2009 às 6:07 pm #91756burga
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');😀
-
AutorPosts
- Você deve fazer login para responder a este tópico.