2013-07-18 3 views
2

У нас есть определенная функция пользователь создал некоторое время назад, который показывает, как «подвешенный» статус в течение недели от:Пользовательская функция «приостановлена» - это нормально?

USE master 
SELECT * 
FROM sys.dm_exec_requests 
CROSS APPLY sys.dm_exec_sql_text(sql_handle) 
ORDER BY start_time 

Строка из запроса выше, имеет «статус» как «приостановлено» и продолжает увеличиваться значения для каждого из:

cpu_time  
210262625 
total_elapsed_time 
623982642  
reads 
741700958 
reads 
19754 
logical_reads 
2938802909 

Я уже убил SPID, когда он достиг 37 млрд logical_reads но используется очень часто, и, конечно, показал обратно вверх и начал этот же шаблон.

Мой вопрос действительно состоит из двух частей.

Во-первых, это обычное поведение для сильно используемой пользовательской функции, чтобы увидеть ее в состоянии ожидания?

Во-вторых, как я могу определить, сколько раз вызывается функция, определенная пользователем? (и потенциально так называемый)

В качестве побочного примечания я не очень доволен функцией и тем, как она была написана, однако, если это не «абсолютно ненормальное» поведение, у меня нет времени переписывать ее в настоящее время ,

ответ

0

Чтобы ответить на ваши вопросы:

  1. Если функция непрерывно работает в течение десяти минут, в то время как показывающий состояние приостановки, я хотел бы использовать свой первый запрос и проверьте следующие столбцы: wait_type, wait_time, last_wait_type , и wait_resource.
  2. Чтобы определить, сколько раз функция была вызвана, используйте первый запрос для захвата функции plan_handle функции. Затем используйте системный вид sys.dm_exec_cached_plans, чтобы получить usecount.

Например:

SELECT 
    DB_NAME(dbid) AS db, 
    OBJECT_NAME(objectid) AS objName, 
    usecounts, 
    size_in_bytes, 
    cacheobjtype 
FROM sys.dm_exec_cached_plans 
CROSS APPLY sys.dm_exec_sql_text(plan_handle) 
WHERE plan_handle = 0x05000700A77A001140A10585000000000000000000000000 

Это звучит как функции либо выполняется в рамках какого-то цикла или иначе обрабатывать огромное количество данных.

Для проверки всех мест, которые можно было бы вызовом функции из базы данных:

SELECT 
    OBJECT_NAME(object_id) AS objectName 
FROM sys.sql_modules 
WHERE definition LIKE '%[function_name]%' 
+0

Это был полезный ответ - оказывается, что функция вызывается из пользовательской активности, но и от работы SQL агента - по-разному, и работа агента зависает, все равно придется вникать в то, почему, но это заставило меня стать жертвой моей «ниндзя sql query killer saber attack» (теперь говорят, что 5 раз очень быстро) –

Смежные вопросы