2016-09-16 8 views
0

я имел открытую связь с Matlab для моего сервера Postgres, и последний запрос был insert into table_name ..., который имел состояние idle, когда я смотрю на процессы на сервере базы данных с помощью:Этот незадействованный запрос заставил мою команду создать уникальную команду индекса для блокировки?

SELECT datname,pid,state,query FROM pg_stat_activity; 

Я попытался создать уникальный индекс на table_name, и это заняло очень много времени, без заметного использования ЦП для процесса pgadmin. Когда я закрыл соединение из Matlab, запрос выпал из pg_stat_activity, и сразу был создан уникальный индекс.

Был ли простой запрос причиной, по которой так долго приходилось создавать индекс?

ответ

2

Нет, сеанс в состоянии “ idle ” не содержит блокировок и ничего не может заблокировать. Это “ простоя в транзакции ” сеансов, которые обычно являются проблемой, потому что они имеют тенденцию удерживать блокировки в течение длительного времени. Такие сеансы почти всегда вызваны ошибкой приложения.

Чтобы исследовать подобные проблемы, посмотрите на вид pg_locks. Зависший оператор CREATE INDEX обычно будет зависать, чтобы получить блокировку ACCESS EXCLUSIVE на индексируемой таблице. Вы должны увидеть это на FALSE в столбце grantedpg_locks. Затем выясните, какой бэкэнд (pid) имеет блокировку на рассматриваемом столе, у вас есть преступник (ы).