logo
Книга по БД(Вальке А

7.7.1. Как узнать, что ждет некоторый запрос

Иногда бывает так, что иногда некоторый запрос выполняется необоснованно долго. Причем, когда проводится специальное тестирование этого запроса, он выполняется быстро. Обычно, подобная ситуация возникает из-за появления блокировки. То есть какой-то другой запрос, поступивший от другого пользователя, заблокировал доступ к информации, которая нужна первому запросу. Подробно правила блокировки рассмотрены в параграфе «Многопользовательский доступ к данным» в разделе про язык SQL. Здесь же мы рассмотрим методику определения того, чьи действия привели к возникновению блокировки.

В качестве первого шага надо определить идентификатор ресурса, который заблокирован. Для этого надо воспользоваться уже известной нам командой

onstat -u

и определить значение поля wait для требуемой сессии. Это поле как раз и является идентификатором объекта, который заблокирован и разблокирование которого ожидается данным запросом. Кстати, поле tout говорит о том, сколько секунд ожидается разблокирование данного запроса. В следующем листинге видно, что запрос пользователя guest ждет освобождение ресурса с идентификатором 831055c0 в течении 13 секунд:

address flags sessid user tty wait tout locks nreads nwrites 83214014 ---P--D 1 informix - 0 0 0 18 13 83214448 ---P--F 0 informix - 0 0 0 0 164 8321487c ---P--B 5 informix - 0 0 0 0 0 83214cb0 L--PR-- 13 guest bibirevo 831055c0 13 1 0 0 832150e4 Y-BP--- 10 andrey taganka 83372a78 0 3 70 18 83215518 ---P--D 8 informix - 0 0 0 0 0 6 active, 128 total, 11 maximum concurrent

Далее, надо определить, кто именно установил данную блокировку. Для этого надо выполнить команду

onstat –k или onstat -s

Команда onstat –k показывает все блокировки, существующие на сервере БД:

Locks address wtlist owner lklist type tblsnum rowid key#/bsiz 83105590 0 832150e4 0 HDR+S 100002 203 0 831055c0 83214cb0 832150e4 83105590 HDR+IX 100080 0 0 831055f0 0 832150e4 831055c0 HDR+X 100080 100 0 83105620 0 83214cb0 0 S 100002 203 0 4 active, 1000 total, 1024 hash buckets

На данном листинге видно, что заблокированный ресурс с идентификатором (колонка lklist) 831055c0 принадлежит пользователю (колонка owner) с идентификатором 832150e4. Колонка owner в команде onstat –k соответствует колонке address, выдаваемой командой onstat –u. Возвращаясь к листингу команды onstat –u видим, что блокировка принадлежит пользователю andrey.

Данная методика основана на анализе листингов стандартных утилит. Такой «ручной» подход не всегда удобен. Для получения аналогичной информации можно воспользоваться и запросом на языке SQL. Дело в том, что вся информация о сессиях и блокировках имеется в системной базе данных sysmaster, в частности, в таблицах syslocks и syssessions. Подробное описание использования данных из этих таблиц имеется в руководстве администратора по Informix Dynamic Server.