Eu tenho uma sequência como esta (no PostgreSQL 16.0):
CREATE SEQUENCE public.seq_1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 999999999
START 1
CACHE 1
CYCLE;
e uma tabela contendo tudo integers
de 0 a 1.000.000
Quando eu faço:
select *, nextval('seq_1') as n2
from (
select i,n1,n1-i as d, sum(i) over (order by i) as s
from (
select i,nextval('seq_1') as n1
from integers
)
)
where i=0 or i=1000000
a saída é:
eu | n1 | d | é | n2 |
---|---|---|---|---|
0 | 46137349 | 46137349 | 0 | 50331653 |
1.000.000 | 47137349 | 46137349 | 500000500000 | 50331654 |
Por que o valor n2
na primeira linha é igual a 50331653?
Eu teria esperado 47137349+1, não me importo com pequenos intervalos, mas neste caso o intervalo é 3194304 ( select 50331653 - 47137349
), que é grande (ou grande?)
Eu encontrei:
- números de salto de sequência do postgres 9.0.4 , então eu uso
CACHE 1
Obviamente, você está familiarizado com a natureza de um
SEQUENCE
objeto - conforme refletido no resultado esperado.Não há nada na sua pergunta que explique a diferença. Recriei o caso de teste e obtive o resultado
n2 = 47137350
esperado. Localmente, bem como neste violino para Postgres 16:violino
n2 = 50331653
no seu resultado é uma surpresa.A diferença observada de 3194303 é ímpar no topo, não sendo um múltiplo simples de 1000001.
Se eu começar com
SEQUENCE
atseq_1 = 1
, o cálculo fica mais óbvio:Deve haver algo mais acontecendo no seu banco de dados. Transações simultâneas extraídas da mesma sequência (parece muito improvável), ou um gatilho, ou um plano de consulta estranho que resulta na queima de mais de 3x os números de sequência. Isso seria acionado por algo em seu banco de dados que não está refletido na pergunta (índices, inchaço, configuração do servidor, estatísticas de coluna, corrupção, comportamento problemático do seu cliente, ...). Execute
EXPLAIN
ouEXPLAIN ANALYZE
compare com o plano de consulta no meu violino.(Mas honestamente não consigo pensar em um plano de consulta que faça isso.)
Você acabou de criar uma lacuna que é tão grande quanto o número de linhas da tabela, portanto, se quiser evitar a criação de grandes lacunas, não faça o que acabou de fazer. Quantas vezes você já fez essa mesma manobra?