Текст как в профайлере (не DBCC INPUTBUFFER) SQLServer2000

kenpachi
Дата: 25.02.2010 15:09:26
Доброго времени суток.

Помогите пожалуйста решить проблему: написано приложение, позволяющее строить рейтинг загрузки CPU сервера. В нем видно, какой юзер какую операцию (читай: процедуру) выполнял и сколько это съело процессорного времени. таким образом можно найти самого злостного грузильщика и поругать его. (или выявить ошибку в собственных процедурах).

Проблема, однако в том, что, в отличие от профайлера, используемый у меня DBCC INPUTBUFFER возвращает только имя процедуры без параметров:
(например текст "exec Список_документов '01.01.01', '02.02.02' " будет выглядеть как "exec Список_документов; 1" )

а функция ::fn_get_sql, вообще, возвращает текст процедуры
("CREATE PROCEDURE dbo.Список_документов @DBEGIN datetime ........")

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

Заранее спасибо.
baracs
Дата: 25.02.2010 17:09:29
kenpachi,

Хм... Может посмотреть процедуры и функции, которые использует профайлер?
Т.е. задача сводится к написанию своего маленького профайлера...

+ P.S.
Почему именно CPU? Чтение/запись, обычно критичнее...
kenpachi
Дата: 25.02.2010 17:35:30
baracs
Хм... Может посмотреть процедуры и функции, которые использует профайлер?
Т.е. задача сводится к написанию своего маленького профайлера...


Я над этим как раз и бъюсь... Как рыз и хочу свой маленький профайлер с функцией блокировки.
Только где бы найти эти самые функции.... Если кто-нибудь знает их, подскажите, пожалуйста.


baracs
Почему именно CPU? Чтение/запись, обычно критичнее...


ЦПУ - это один из параметров. Чтение\запись и время выполнения процедур также хронометрируется.
baracs
Дата: 25.02.2010 17:42:44
kenpachi
Как рыз и хочу свой маленький профайлер с функцией блокировки.
Только где бы найти эти самые функции....
В BOL ессно

Навскидку из 2000-го:
sp_trace_create
sp_trace_generateevent,
sp_trace_setevent,
sp_trace_setfilter,
sp_trace_setstatus,
fn_trace_geteventinfo,
fn_trace_getinfo,
fn_trace_getfilterinfo
Glory
Дата: 25.02.2010 17:46:58
kenpachi
baracs
Хм... Может посмотреть процедуры и функции, которые использует профайлер?
Т.е. задача сводится к написанию своего маленького профайлера...


Я над этим как раз и бъюсь... Как рыз и хочу свой маленький профайлер с функцией блокировки.
Только где бы найти эти самые функции.... Если кто-нибудь знает их, подскажите, пожалуйста.

Профайлер не покажет вам текущую нагрузку, которую создают выполняемые в коннекте запросы.
О затраченных на запрос ресурсах вы узнаете только после окончания запроса.

Используйте
sys.dm_exec_query_stats
sys.dm_exec_sql_text
для анализа
Glory
Дата: 25.02.2010 18:04:17
Хотя у вас SQLServer2000.
Там вы сможете оценивать загрузку по коннектам только через периодический опрос sysprocesses и сравнения предыдущих значений cpu/physical_io и тп
kenpachi
Дата: 25.02.2010 19:09:08
Glory
Хотя у вас SQLServer2000.
Там вы сможете оценивать загрузку по коннектам только через периодический опрос sysprocesses и сравнения предыдущих значений cpu/physical_io и тп


Я так и делаю. И уже все работает. Вытаскиваю из sysprocesses показатели, запоминаю, жду смены статуса.. и.т.д. работает, в общем.
Только чтобы узнать, какую процедуру выполнял этот спид - использую dbcc inputbuffer. А он не дает мне параметров, использованных в хранимке. а он мне показывает точку с запятой и единицу :)

(это для того нужно, чтобы узнать: если пользователь строит список документов за год - тогда неудивительно, что он грузит сервак и ему след сказать об этом. А если параметры нормальные, то косяк - в самой процедуре. //более важна первая часть функции - по отлову неумелых юзеров)
kenpachi
Дата: 25.02.2010 19:11:57
kenpachi

Я над этим как раз и бъюсь... Как рыз и хочу свой маленький профайлер с функцией блокировки.
Только где бы найти эти самые функции.... Если кто-нибудь знает их, подскажите, пожалуйста.


Извеняюсь, ошибка была вместо слова "блокировки" имелось ввиду "группировки". (по пользователю, по операции, по пользователю и операции)
Glory
Дата: 26.02.2010 10:34:29
kenpachi
Glory
Хотя у вас SQLServer2000.
Там вы сможете оценивать загрузку по коннектам только через периодический опрос sysprocesses и сравнения предыдущих значений cpu/physical_io и тп


Я так и делаю. И уже все работает. Вытаскиваю из sysprocesses показатели, запоминаю, жду смены статуса.. и.т.д. работает, в общем.
Только чтобы узнать, какую процедуру выполнял этот спид - использую dbcc inputbuffer. А он не дает мне параметров, использованных в хранимке. а он мне показывает точку с запятой и единицу :)

Это и есть то, что отправил клиент серверу на выполнение.
kenpachi
Дата: 26.02.2010 11:49:14
Glory
kenpachi
он не дает мне параметров, использованных в хранимке, а показывает точку с запятой и единицу :)

Это и есть то, что отправил клиент серверу на выполнение.


Как же так? Не угадывает же он то, что клиент хочет от него.

Я пробовал задавать разные параметры при вызове процедур.
inputbuffer все равно показывает
"Список_документов;1"
хотя в профайлере при этом четко видно:
"exec Список_документов '01.01.10', '02.02.10' "

При изменении параметров, профайлер честно их все рисует, а inputbuffer не дает ничего, кроме этой единички..