В настоящее время я использую Postgres в качестве движка базы данных для приложения.
В настоящее время у меня есть ситуация, когда у меня присутствует много блокировок READ (AccessSharedLocks). Я запускаю следующий запрос, чтобы проверить блокировки:
SELECT t.schemaname,
t.relname,
l.locktype,
l.page,
l.virtualtransaction,
l.pid,
l.mode,
l.granted
FROM pg_locks l
JOIN pg_stat_all_tables t ON l.relation = t.relid
WHERE t.schemaname <> 'pg_toast'::name AND t.schemaname <> 'pg_catalog'::name
Я хотел бы знать, как долго блокировка была получена таблицей. Есть ли способ получить эту информацию?
Заранее спасибо.
Итак, правильно ли я изменил приведенный выше запрос, чтобы присоединиться к таблице pg_stat_activity в столбце pid для использования этого свойства?
Да, вам нужно присоединиться к представлению pg_stat_activity в столбце pid
хорошо спасибо. Итак, просто для моего понимания, используя это поле xact_start, будет ли это эквивалентно заявлению о том, что это время, когда блокировка была получена процессом, который используется для этой транзакции?
xact_start
отображает Time when this process' current transaction was **started**, or null if no transaction is active. If the current query is the first of its transaction, this column is equal to the query_start column.
Время блокировки может отличаться от времени начала блокировки в thoery.
Просто проверьте эти просмотры postgresql.org/docs/9.3/static/…, может быть, лучше.
Время блокировки будет таким же, как время начала транзакции, только если блокировка была вызвана первой операцией в транзакции, в противном случае оно будет другим.
Время, когда была взята блокировка, недоступно в PostgreSQL.
Лучшее, что вы можете сделать, - это взять время начала транзакции xact_start
из pg_stat_activity
, что является нижней границей для возраста блокировки.
Транзакции всегда должны быть короткими, потому что длинные транзакции удерживают блокировки и не позволяют автоочистке выполнять свою работу.
Если у вас есть какие-либо длительные транзакции, это может быть проблемой, которую вам нужно исправить. Тогда с замками не будет такой проблемы.
Понял. большое спасибо Laurenz и Raymond
Это представление (postgresql.org/docs/9.3/static/…) может помочь вам, вам понадобится столбец
xact_start
, который содержит время начала транзакции ... Затем вы можете просто вычислить