Для примера возьмем запрос определения горизонта базы данных из книги Мониторинг PostgreSQL Алексея Лесовского
Код: Выделить всё
SELECT datname, datfrozenxid, age(datfrozenxid) AS horizon FROM pg_database;
Если указана одна дата, функция age возвращает разницу между текущей и указанной датами.
Столбец datfrozenxid имеет тип данных xid, тип системных идентификаторов, представляющий идентификатор транзакции (сокращённо xact)
Но тип данных xid это не time или timestamp. Как же тогда работает функция age?
Обратимся к исходному коду PostgreSQL В исходном коде видно, что реализация age(xid) возвращает разницу менжду текущим идентификатором транзакции xid и указанным xid
Можно убедиться в этом, добавив функцию pg_current_xact_id() и несложное преобразование, что возвращает аналогичный результат:
Код: Выделить всё
postgres=# SELECT datname, CAST(CAST(pg_current_xact_id() as TEXT) as BIGINT) - CAST(CAST(datfrozenxid as TEXT) as BIGINT), age(datfrozenxid) AS horizon FROM pg_database;
datname | ?column? | horizon
-------------------+----------+---------
postgres | 836623 | 836623
template1 | 836623 | 836623
template0 | 836623 | 836623
(3 rows)
Таблица 9.84. Устаревшие функции получения информации об идентификаторах транзакций и снимках состояния
Какую функцию использовать в запросах мониторинга базы данных вместо age(xid)?