Идентификатор объекта Postgresql и кортежи

Иногда я вижу сообщения типа

Процесс 12990 ожидает ExclusiveLock по кортежу (889,66) отношения 17720 базы данных 17607; заблокирован процессом 12992.

Итак, конечно, часть "процесса" совершенно ясна, но я не знаю, как соотнести между идентификатором отношения и понятным для человека именем. Я также не знаю, что делать с битом кортежа.

Кто-нибудь знает, как читать эти сообщения и как извлекать из них полезные данные?

Спасибо!

Ответы

Ответ 1

Вы можете посмотреть это на системные таблицы: здесь интересен pg_class.

Выполнение запроса типа

SELECT OID, relname FROM pg_class
 oid  |              relname               
-------+------------------------------------
  1247 | pg_type
 11550 | user_mapping_options
 11554 | user_mappings
 11494 | triggered_update_columns
 11497 | triggers

или скорее

SELECT relname FROM pg_class WHERE OID=17720

может пролить свет на блокировки.

Ответ 2

"Отношение" - это таблица, а "кортеж" - это строка.

Здесь красивый ярлык для получения имени таблицы из идентификатора таблицы (вы также можете запросить таблицу pg_class):

=> select 17720::regclass;
┌──────────┐
│ regclass │
├──────────┤
│ my_table │
└──────────┘
(1 row)

Теперь как насчет строки? "Кортежный бит" является идентификатором кортежа, и каждая таблица в вашей базе данных имеет специальный столбец ctid, где хранятся эти идентификаторы. Теперь, когда мы знаем эту таблицу, мы можем сделать:

=> select * from my_table where ctid='(889,66)';

Однако! Из документов системного столбца (выделено мной): "[A], хотя ctid можно использовать для быстрого поиска версии строки, строка ctid изменит, если она обновлена ​​или перемещена VACUUM FULL. Поэтому ctid бесполезен как идентификатор долгосрочной строки." Другими словами, если вы достаточно быстр, вы, вероятно, можете доверять тому, что возвращаемая строка является той, которая задействована в тупике, но эта информация не будет доступна навсегда.