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

kenpachi

Доброго времени суток.Помогите пожалуйста решить проблему: написано приложение, позволяющее строить рейтинг загрузки CPU сервера. В нем видно, какой юзер какую операцию (читай: процедуру) выполнял и сколько это съело процессорного времени. таким образом можно найти самого злостного грузильщика и поругать его. (или выявить ошибку в собственных процедурах).Проблема, однако в том, что, в отличие от профайлера, используемый у меня DBCC INPUTBUFFER возвращает только имя процедуры без параметров: (например текст "exec Список_документов '01.01.01', '02.02.02' " будет выглядеть как "exec Список_документов; 1" ) а функция ::fn_get_sql, вообще, возвращает текст процедуры ("CREATE PROCEDURE dbo.Список_документов @DBEGIN datetime ........")подскажите, как узнать, какие параметры использовались при вызове хранимой процедуры (как показывается в профайлере)Заранее спасибо.
24 ответа

kenpachi

Ну тогда притензии к приложению, которе использует такой метод работы с сервером...чтобы текст был как в профайлере, нужно использовать профайлер
Слушайте, ну если не знаете, зачем же отвечать?Приложением будут пользоваться пользователи. Учить их пользоваться профайлером не хочется. (да и не желательно это.) Здесь же я фильтрую всё по своему приложению.Было бы здорово, если бы кто-то подсказал: мол "вызываешь такие-то процедуры, получаешь текст и параметры".Либо: "нету такого способа, сам месяц бился и не нашел"А я пока только слышу: "используй профайлер, используй профайлер..".Использую, но хочу, чтобы люди пользовались моим приложением и слали мне логи.


kenpachi

Слушайте, ну если не знаете, зачем же отвечать?Приложением будут пользоваться пользователи. Учить их пользоваться профайлером не хочется. (да и не желательно это.) Здесь же я фильтрую всё по своему приложению.
А что отвечать на такие вопросы ? Типа есть секретная кнопка, чтобы получить, что вам надо ?Или еще раз дать ссылку на уже озвученные документированные процедуры для программного создания трасс ?


kenpachi

А что отвечать на такие вопросы ? Типа есть секретная кнопка, чтобы получить, что вам надо ?Или еще раз дать ссылку на уже озвученные документированные процедуры для программного создания трасс ?
Ну вот же, замечательный ответ. Сразу ясно, что если такие процедуры, функции или системные таблицы и существуют, то о них никто не знает. Единственный выход - программное создание и отлавливание трасс.Просто я надеялся найти более легкий способ, чтобы с нуля не переписывать весь свой код. (но это, видимо, неизбежно... :'( )Большое спасибо Вам и всем остальным за участие в вопросе :)


kenpachi

я делал такое, даже экзешник осталсяда, для оперативной работы надо читать sysprocessesа вот команды легко ловятся от трассы по RpcStart, BatchStartдействительно, достаточно оперативно видно кто грузит систему, причем по всем показателям - CPU / IO / Mem


kenpachi

я делал такое, даже экзешник осталсяда, для оперативной работы надо читать sysprocessesа вот команды легко ловятся от трассы по RpcStart, BatchStartдействительно, достаточно оперативно видно кто грузит систему, причем по всем показателям - CPU / IO / Mem
спасибо за совет :) надо будет попробовать


kenpachi

[quot Crimean]я делал такое, даже экзешник осталсяда, для оперативной работы надо читать sysprocessesа вот команды легко ловятся от трассы по RpcStart, BatchStartдействительно, достаточно оперативно видно кто грузит систему, причем по всем показателям - CPU / IO / Mem
а не сохранилось ли еще и кода :)


kenpachi

kenpachi,если c# устроит скажите куда проект сбросить, мне пока без надобности


kenpachi

kenpachi,если c# устроит скажите куда проект сбросить, мне пока без надобности
[removed_email]спасибо. не хочется заново изобретать придуманного другими велосипеда :)


kenpachi

с гугла ушло


kenpachi

http://www.itcommunity.ru/blogs/rsug/archive/2009/10/14/80012.aspx http://www.itcommunity.ru/blogs/rsug/archive/2009/10/14/80014.aspxДля 2005-го, но несложно переточить под 2000.-------------------------There’s no silver bullet!


kenpachi

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


kenpachi

Хм... Может посмотреть процедуры и функции, которые использует профайлер?Т.е. задача сводится к написанию своего маленького профайлера...
Я над этим как раз и бъюсь... Как рыз и хочу свой маленький профайлер с функцией блокировки.Только где бы найти эти самые функции.... Если кто-нибудь знает их, подскажите, пожалуйста.
Почему именно CPU? Чтение/запись, обычно критичнее...
ЦПУ - это один из параметров. Чтение\запись и время выполнения процедур также хронометрируется.


kenpachi

Как рыз и хочу свой маленький профайлер с функцией блокировки.Только где бы найти эти самые функции....
В BOL ессно Навскидку из 2000-го:sp_trace_createsp_trace_generateevent,sp_trace_setevent,sp_trace_setfilter,sp_trace_setstatus,fn_trace_geteventinfo,fn_trace_getinfo,fn_trace_getfilterinfo


kenpachi

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


kenpachi

Хотя у вас SQLServer2000.Там вы сможете оценивать загрузку по коннектам только через периодический опрос sysprocesses и сравнения предыдущих значений cpu/physical_io и тп


kenpachi

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


kenpachi

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


kenpachi

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


kenpachi

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


kenpachi

вот цитата из BOL:(Поле EventInfo функции DBCC)EventInfo - nvarchar(255) - For an EventType of RPC, EventInfo contains only the procedure name. For an EventType of Language or No Event, only the first 255 characters of the event are displayed. то есть для хранимых процедур отображается только название без параметров. Что не есть хорошо..


kenpachi

то есть для хранимых процедур отображается только название без параметров. Что не есть хорошо..
Ну, не хорошо. А вопрос-то какой?


kenpachi

вот цитата из BOL:(Поле EventInfo функции DBCC)EventInfo - nvarchar(255) - For an EventType of RPC, EventInfo contains only the procedure name. For an EventType of Language or No Event, only the first 255 characters of the event are displayed. то есть для хранимых процедур отображается только название без параметров. Что не есть хорошо..
RPC - это remote procedure call.


kenpachi

RPC - это remote procedure call.
это я знаю.
Ну, не хорошо. А вопрос-то какой?
Вопрос: как получить эти параметры. То есть, чтобы текст был как в профайлере.


kenpachi

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