Функция в запросах мониторинга базы данных вместо age

«Пост-Грэс-Кью-Эл» свободная объектно-реляционная СУБД. Обмениваемся вопросами и ответами о её работе.
Ответить
AntonS
Сообщения: 116
Зарегистрирован: Пт июн 03, 2022 8:51 am

Функция в запросах мониторинга базы данных вместо age

Сообщение AntonS »

В запросах мониторинга БД PostgreSQL встречается функция age.
Для примера возьмем запрос определения горизонта базы данных из книги Мониторинг PostgreSQL Алексея Лесовского

Код: Выделить всё

SELECT datname, datfrozenxid, age(datfrozenxid) AS horizon FROM pg_database;
Из документации PostgreSQL: функция age вычитает аргументы и выдаёт «символический» результат с годами и месяцами, а не просто днями, т.е. возвращает количество лет, месяцев и дней между двумя указанными датами.
Если указана одна дата, функция 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)
Также в документации функция age(xid) переведена в разряд устаревших
Таблица 9.84. Устаревшие функции получения информации об идентификаторах транзакций и снимках состояния

Какую функцию использовать в запросах мониторинга базы данных вместо age(xid)?
Ответить