2009-10-13 4 views
0

Я использовал sql из этой статьи https://web.archive.org/web/1/http://blogs.techrepublic%2ecom%2ecom/datacenter/?p=275, чтобы попытаться отследить причину большого количества блокировок, которое происходит недавно в моей базе данных sql server 2005. Несколько раз все возвращенные процессы вызывают функцию «create function ...», функции меняются, но некоторые из них будут создавать одну и ту же функцию. Из деталей, включенных в статью, и, глядя на то, что находится в таблицах, набор результатов, построенный из него, не выглядит так, как обычно вызывается эти операторы создания. Означает ли это перекомпиляцию рассматриваемых функций? Или что-то другое?SQL Server блокирует функцию «create function ...», что это подразумевает?

Спасибо за любую помощь,

Робин

+0

Можете ли вы рассказать нам, почему вы используете 'CREATE FUNCTION' во время выполнения? –

ответ

4

Вы должны использовать statement_start_offset и statement_end_offsets из sys.dm_exec_requests (не используют sysprocesses, как показано в статье) в подстроку из секции обижая кода , См. Пример в теме BOL для sys.dm_exec_sql_text().

EDIT:

Вот как сделать то, что я сказал выше:

SELECT 
    spid = r.session_id, 
    BlockingSPID = r.blocking_session_id, 
    DatabaseName = DB_NAME(r.database_id), 
    s.program_name, 
    s.login_name, 
    ObjectName = OBJECT_NAME(st.objectid, st.dbid), 
    Definition = SUBSTRING(st.text, (r.statement_start_offset/2)+1, 
     ((CASE r.statement_end_offset 
      WHEN -1 THEN DATALENGTH(st.text) 
     ELSE r.statement_end_offset 
     END - r.statement_start_offset)/2) + 1) 
FROM sys.dm_exec_requests r 
JOIN sys.dm_exec_sessions s ON r.session_id = s.session_id 
CROSS APPLY sys.dm_exec_sql_text (sql_handle) st 
WHERE r.session_id > 50 

Выход будет отличаться, потому что только в настоящее время, исполняющие запросы в dm_exec_requests DMV, где sysprocesses показывает каждый SPID , выполнение или нет. Однако вы можете найти свои блокирующие операторы с приведенным выше кодом.