Pessoal,
Só para finalizar o assunto... fiz alguns testes e consegui simular a
situação que descrevi e que os amigos contribuiram...
1) Criando a sequence e verificando as informações:
postg...@bdteste=# CREATE SEQUENCE teste_seq;
CREATE SEQUENCE
postg...@bdteste=# SELECT nextval('teste_seq');
nextval
---------
1
(1 row)
postg...@bdteste=# SELECT * FROM teste_seq;
sequence_name | last_value | increment_by | max_value |
min_value | cache_value | log_cnt | is_cycled | is_called
---------------+------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------
teste_seq | 1 | 1 | 9223372036854775807 |
1 | 1 | 0 | f | t
(1 row)
postg...@bdteste=# SELECT nextval('teste_seq');
nextval
---------
2
(1 row)
postg...@bdteste=# SELECT * FROM teste_seq;
sequence_name | last_value | increment_by | max_value |
min_value | cache_value | log_cnt | is_cycled | is_called
---------------+------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------
teste_seq | 2 | 1 | 9223372036854775807 |
1 | 1 | 32 | f | t
(1 row)
postg...@bdteste=# SELECT nextval('teste_seq');
nextval
---------
3
(1 row)
postg...@bdteste=# SELECT * FROM teste_seq;
sequence_name | last_value | increment_by | max_value |
min_value | cache_value | log_cnt | is_cycled | is_called
---------------+------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------
teste_seq | 3 | 1 | 9223372036854775807 |
1 | 1 | 31 | f | t
(1 row)
* Notem acima o valor da coluna "log_cnt" que o PostgreSQL realiza um
cache de 32 para minimizar as escritas no wal... conforme consta em
src/backend/command/sequence.c
2) Neste ponto iniciamos uma transacao e executamos o nextval
postg...@bdteste=# BEGIN;
BEGIN
postg...@bdteste=# SELECT nextval('teste_seq');
nextval
---------
4
(1 row)
postg...@bdteste=# SELECT * FROM teste_seq;
sequence_name | last_value | increment_by | max_value |
min_value | cache_value | log_cnt | is_cycled | is_called
---------------+------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------
teste_seq | 4 | 1 | 9223372036854775807 |
1 | 1 | 32 | f | t
(1 row)
postg...@bdteste=# SELECT nextval('teste_seq');
nextval
---------
5
(1 row)
postg...@bdteste=# SELECT * FROM teste_seq;
sequence_name | last_value | increment_by | max_value |
min_value | cache_value | log_cnt | is_cycled | is_called
---------------+------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------
teste_seq | 5 | 1 | 9223372036854775807 |
1 | 1 | 31 | f | t
(1 row)
3) Nesta etapa "simulamos" um "crash" no servidor... neste neste que
realizei no meu note eu simplesmente desliguei o mesmo direto no power
para simular, por exemplo, uma queda de energia.
postg...@bdteste=# SELECT * FROM teste_seq;
sequence_name | last_value | increment_by | max_value |
min_value | cache_value | log_cnt | is_cycled | is_called
---------------+------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------
teste_seq | 36 | 1 | 9223372036854775807 |
1 | 1 | 0 | f | t
(1 row)
postg...@bdteste=# SELECT nextval('teste_seq');
nextval
---------
37
(1 row)
* Verificando o que aconteceu notamos que o proximo valor disponivel é
o último valor acrescentado 32, ou seja, 5 + 32 = 37.
Com isso podemos acompanhar o comportamento do PostgreSQL em relação a
manipulação das sequences.
Agradeço as dicas dos colegas... um grande abraço.
--
Fabrízio de Royes Mello
>> Blog sobre TI: http://fabriziomello.blogspot.com
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral