AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 343731
Accepted
blackgreen
blackgreen
Asked: 2024-11-20 18:13:17 +0800 CST2024-11-20 18:13:17 +0800 CST 2024-11-20 18:13:17 +0800 CST

O uso simultâneo de nextval com generate_series garante o retorno de valores incrementais?

  • 772

Preciso obter vários valores de uma sequência com apenas uma consulta. No Stack Overflow, encontrei isto:

https://stackoverflow.com/questions/896274/select-multiple-ids-from-a-postgresql-sequence

A solução parece ser a seguinte:

select nextval('my_sequence') from generate_series(1, N)

Como isso se comporta quando meu aplicativo pode iniciar essa consulta simultaneamente sempre que atende a alguma solicitação do cliente?

A resposta mais votada tem um comentário que diz:

Observe que não há garantia de que os 3 números (nextvals) sejam sequenciais.

Não me importo necessariamente com a sequencialidade, mas é garantido que os valores retornados sejam pelo menos estritamente crescentes monotonicamente, mesmo que possam ser entrelaçados com os valores gerados por outra consulta simultânea?

postgresql
  • 1 1 respostas
  • 130 Views

1 respostas

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2024-11-20T18:22:17+08:002024-11-20T18:22:17+08:00

    Sim , a série gerada tem garantia de ser estritamente monotonicamente crescente - para esta consulta simples e SEQUENCEcom configurações padrão .

    A SEQUENCEpode até ser criada com incremento negativo! E se você adicionar junções, agrupamentos ORDER BYou qualquer outra coisa à mesma consulta que possa reordenar linhas, isso pode embaralhar os números gerados de acordo, dependendo do plano de consulta resultante.

    Mas não , sempre pode haver lacunas se transações simultâneas também extraírem da mesma sequência. Use outras ferramentas para números estritamente sequenciais. O manual:

    Como as chamadas nextvale setvalnunca são revertidas, os objetos de sequência não podem ser usados ​​se a atribuição “gapless” de números de sequência for necessária. É possível construir uma atribuição gapless usando o bloqueio exclusivo de uma tabela contendo um contador; mas essa solução é muito mais cara do que os objetos de sequência, especialmente se muitas transações precisarem de números de sequência simultaneamente.

    Se cada acesso simultâneo for executado em sua própria sessão, que é fechada depois, você pode usar a CACHEconfiguração de sequências. Mas isso visa principalmente acesso mais rápido e pode resultar em maiores lacunas de sequência para outros padrões de acesso. E nem tenho certeza de que "gapless" é garantido para o cache.

    Mais sobre o tópico:

    • Uma nova transação pode reivindicar um ID de sequência mais antigo?

    Obtenha números estritamente sequenciais com um hack

    LOCKnão funciona para sequências.
    Mas podemos bloquear o objeto de sequência indiretamente com ALTER SEQUENCE. O manual:

    ALTER SEQUENCEbloqueia chamadas simultâneas nextval, currval, lastval, e .setval

    Assumindo os privilégios necessários (!) poderíamos fazer isso, dentro da mesma transação:

    BEGIN;  
    ALTER SEQUENCE public.my_sequence INCREMENT 1;  -- the same as it was!
    SELECT nextval('public.my_sequence') FROM generate_series(1, 5);
    
    -- do stuff, but hurry up, the sequence is blocked
    
    COMMIT;
    

    Na verdade, não estamos alterando a sequência, mas ela ainda bloqueia todas as interações simultâneas com ela. Portanto, você obtém números estritamente sequenciais. Outras transações envolvidas têm que esperar até que a sua seja concluída e libere o bloqueio. Meio que desafia o propósito de uma sequência de otimizar o acesso de gravação simultânea, temporariamente. Mas você obtém sua série sequencial.

    Normalmente, você não desejaria conceder o privilégio a ALTER SEQUENCEfunções aleatórias. Mas você poderia encapsular esse comando em uma função privilegiada e conceder acesso a essa função a qualquer um - efetivamente concedendo o privilégio de acessar a sequência exclusivamente... Relacionado:

    • Permissão para sequência em outro esquema

    Outra anomalia : se sua transação termina em um ROLLBACK, a sequência é redefinida para seu estado original, incluindo o número atual antes de suas nextval()chamadas. Isso nunca acontece em operação normal, mesmo para transações revertidas. Se você continuar a usar esses números, você encontrará violações únicas...

    • 5

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve