Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Виснет sys.dm_exec_sql_text  [new]
Serg_77m
Member

Откуда: Донецк
Сообщений: 237
Доброго времени суток.

Для просмотра состояния сервера выполняю следующий запрос:
select
  a.spid,a.login_time as ltime,
  rtrim(hostname) as host,rtrim(program_name) as prog,
  a.cpu,a.physical_io as physio,
  rtrim(loginame) as login,
  rtrim(a.status) as status,
    substring(st.text, (a.stmt_start/2)+1,
      ((case a.stmt_end when 0 then null
                        when -1 then datalength(st.text) 
                        else a.stmt_end 
        end - a.stmt_start)/2)+1) AS st_text
from master..sysprocesses a
   outer apply sys.dm_exec_sql_text(a.sql_handle) st
where a.spid>50

Проблема в том, что иногда (когда на сервере выполняются некоторые длинные процедуры) он зависает. И возвращает результат только после того как эта длинная процедура отработает. Виснет функция sys.dm_exec_sql_text, если её убрать, зависаний не происходит. Виснет не при каждом запуске, если его прервать зависший и запустить снова - часто выполняется нормально (а процедуры всё это время продолжают выполняться).
Можно это как-нибудь вылечить?
Версия сервера - MS SQL 2005 Standard Edition - 9.00.5292.00 (Intel X86)
Но то же самое на 2008, 2008R2, 2012 с разными сервис паками (все Express).
4 дек 13, 12:27    [15238203]     Ответить | Цитировать Сообщить модератору
 Re: Виснет sys.dm_exec_sql_text  [new]
Glory
Member

Откуда:
Сообщений: 104760
Serg_77m
Можно это как-нибудь вылечить?

Взять и помониторить
- статус коннекта, который выполняет этот запрос
- блокировки коннекта, который выполняет этот запрос
4 дек 13, 12:31    [15238239]     Ответить | Цитировать Сообщить модератору
 Re: Виснет sys.dm_exec_sql_text  [new]
Serg_77m
Member

Откуда: Донецк
Сообщений: 237
Кажется, разобрался.
Эти хитрые процедуры рассчитывают одну таблицу. На таблицу навешен триггер и несколько индексированных представлений. В начале таблица обнуляется при помощи truncate table, а поскольку индексированные представления мешают, то перед truncate выполняется drop view, а после - create view + create index. А затем, собственно таблица наполняется данными. Всё это в одной транзакции. При этом на таблице, представлениях и триггере висит блокировка Sch-M. В момент вставки данных в таблицу, срабатывает триггер, а если в этот момент выполняется функция sys.dm_exec_sql_text, она запрашивает блокировку Sch-S на этот триггер, чтобы достать оттуда текст. На которой и виснет.
Не совсем понятно только почему ставится блокировка Sch-M на триггер, он вроде бы не меняется...

Только задача осталась. Есть сервер, на котором выполняется неизвестно что. Хочется посмотреть, какие запросы выполняются в текущий момент времени. Получается, что если некая хранимая процедура создаётся или модифицируется, и затем выполняется в пределах одной транзакции, то выполняющийся фрагмент из неё не увидеть?
4 дек 13, 16:18    [15240478]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить