Postgres 9,5 wprowadził nową funkcję związaną z tym problemem:commit timestamps .
Wystarczy aktywować track_commit_timestamp
w postgresql.conf
(i uruchom ponownie!), aby rozpocząć śledzenie znaczników czasu zatwierdzenia. Następnie możesz zapytać:
SELECT * FROM tbl
WHERE pg_xact_commit_timestamp(xmin) >= '2015-11-26 18:00:00+01';
Przeczytaj rozdział "Zatwierdź śledzenie znacznika czasu"
w Postgres Wiki.
Powiązane narzędzie funkcje w instrukcji
.
Zmienność funkcji jest tylko VOLATILE
ponieważ identyfikatory transakcji (xid
) można zawijać zgodnie z definicją. Więc nie możesz utworzyć funkcjonalnego indeksu na nim.
Możesz sfałszować IMMUTABLE
zmienność w opakowaniu funkcji dla aplikacji w ograniczonym czasie, ale musisz mieć świadomość konsekwencji. Powiązany przypadek z dodatkowym wyjaśnieniem:
- Czy PostgreSQL obsługuje „niewrażliwe na akcenty” " zestawienia?
- Jak słowa kluczowe IMMUTABLE, STABLE i VOLATILE wpływają na zachowanie funkcji?
W wielu przypadkach użycia (takich jak twój?), które są zainteresowane tylko sekwencją zatwierdzeń (a nie czasem bezwzględnym), bardziej wydajna może być praca z xmin
rzutuj na bigint
„bezpośrednio” (xmin::text::bigint
) zamiast sygnatur czasowych zatwierdzenia. (xid
jest wewnętrznie liczbą całkowitą bez znaku, górna połowa, która nie mieści się w integer
ze znakiem .) Ponownie, pamiętaj o ograniczeniach związanych z możliwym zawijaniem xid.
Z tego samego powodu znaczniki czasu zatwierdzenia nie są zachowywane w nieskończoność . W przypadku małych i średnich baz danych xid
zawijanie prawie nigdy się nie zdarza — ale w końcu tak się stanie, jeśli klaster będzie działał wystarczająco długo. Przeczytaj rozdział "Zapobieganie błędom owijania identyfikatora transakcji" w instrukcji, aby uzyskać szczegółowe informacje.