Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
a.tarannikova Member Откуда: Сообщений: 153 |
Мальчики, привет. sys.dm_exec_sql_text , при селектах нормально показывается запросы, про при процедурах всместо запроса показывает скрипт на создание этотй процедуры ![]() Подскажите как текст запроса достать, даже при использовании процедур. |
20 апр 17, 13:56 [20418713] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
дак привет, исполняется же то, что написано в тексте процедуры. или надо-то что, индивидуальный стэйтмент выгрести? |
20 апр 17, 14:00 [20418734] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
a.tarannikova,SELECT CASE transaction_isolation_level WHEN 0 THEN 'Unspecified' WHEN 1 THEN 'ReadUncommitted' WHEN 2 THEN 'ReadCommitted' WHEN 3 THEN 'Repeatable' WHEN 4 THEN 'Serializable' WHEN 5 THEN 'Snapshot' END AS ILevel , r.session_id , requested_memory_MB = x.requested_memory_kb/1000. , granted_memory_MB = x.granted_memory_kb/1000. , x.query_cost , r.start_time , RunTime = DATEDIFF(s,r.start_time,getdate())/60. , TotalElapsedTime_min = r.total_elapsed_time/1000./60. , r.[status] , r.command , r.percent_complete , DatabaseName = DB_Name(r.database_id) , r.wait_type , r.last_wait_type , r.wait_resource , r.cpu_time , r.reads , r.writes , r.logical_reads , t.[text] AS [executing batch] , SUBSTRING( t.[text], r.statement_start_offset / 2, ( CASE WHEN r.statement_end_offset = -1 THEN DATALENGTH (t.[text]) ELSE r.statement_end_offset END - r.statement_start_offset ) / 2 ) AS [executing statement] , p.query_plan FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS t CROSS APPLY sys.dm_exec_query_plan(r.plan_handle) AS p LEFT JOIN sys.dm_exec_query_memory_grants x ON x.session_id = r.session_id WHERE r.session_id != @@spid ORDER BY r.total_elapsed_time DESC; |
20 апр 17, 14:02 [20418752] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
[individual query] = substring(t.text , r.statement_start_offset / 2 + 1, ( case when r.statement_end_offset = - 1 then len(convert(nvarchar(max), t.text)) * 2 else r.statement_end_offset end - r.statement_start_offset ) / 2), r = sys.dm_exec_requests t = sys.dm_exec_sql_text(r.sql_handle) |
20 апр 17, 14:03 [20418755] Ответить | Цитировать Сообщить модератору |
SomewhereSomehow Member Откуда: Moscow Сообщений: 2480 Блог |
a.tarannikova, Лучше не изобретайте свой велосипед, а используйте уже изобретенный. Создайте себе процедуру sp_whoisactive и пользуйтесь на здоровье. |
20 апр 17, 14:12 [20418810] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8353 |
a.tarannikova, девочки справку и примеры по sys.dm_exec_sql_text читать не умеют? |
20 апр 17, 14:33 [20418897] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31785 |
a.tarannikova, только не увлекайтесь dm_exec_sql_text, бывает, что сервер падает из за её использования. |
20 апр 17, 15:24 [20419186] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
примерчик, плиз! |
||
20 апр 17, 15:26 [20419203] Ответить | Цитировать Сообщить модератору |
a.tarannikova Member Откуда: Сообщений: 153 |
мне она не нравится... |
||
20 апр 17, 15:29 [20419219] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
тем, что там есть ХУ? |
||||
20 апр 17, 15:31 [20419223] Ответить | Цитировать Сообщить модератору |
a.tarannikova Member Откуда: Сообщений: 153 |
Мне, ХУ везде не мерещатся... Просто не охото ее устанавливать. |
||||
20 апр 17, 15:35 [20419240] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
в рекомендуемой SomewhereSomehow sp_whoisactive тоже используется это dmv. почему-то ни автор, ни комментарии не описывают случаи падения сервера. поэтому все же повторю свой вопрос, если не пример, то хотя бы где почитать отзываы пострадавших? |
||
20 апр 17, 15:38 [20419255] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
инсталлятор наверное трудные вопросы задает на неведомом языке? --- а свои процедуры рука не устает "устанавливать"? |
||
20 апр 17, 15:40 [20419276] Ответить | Цитировать Сообщить модератору |
LSV Member [заблокирован] Откуда: Киев Сообщений: 30817 |
Чота как то руки не дошли ее пощупать. |
||||
20 апр 17, 15:41 [20419280] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31785 |
Мы перегружали сервер из за этого. Связано не только с dm_exec_sql_text, но вообще с неправильным использованием sql_handle из динамических представлений. Вот, скажем, баг: https://connect.microsoft.com/SQLServer/feedback/details/700488/non-yielding-scheduler-when-outer-joining-dmvs-with-a-mismatched-on-clause |
||||
20 апр 17, 15:49 [20419333] Ответить | Цитировать Сообщить модератору |
SomewhereSomehow Member Откуда: Moscow Сообщений: 2480 Блог |
alexeyvg, Ну, это все-таки не баг sp_whoisacive. Она же использует стандартные dmv. Т.е. нет стаховки от ошибки, если вы будете использовать DMV вместо нее? Хотя я с таким не сталкивался. Процедура удобна, чтобы не писать то, что было написано и протестировано давно - т.е. это не какой-то rocket science и никак без нее нельзя, а просто экономит время. a.tarannikova, в таком случае, гугл в помощь. Можете также открыть код нелюбимой вами процедуры и посмотреть, как она достает данные =) |
20 апр 17, 16:36 [20419561] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31785 |
Там статус бага - пофиксен, но не пойму, в каких апдэйтах или сервис-паках. Я сталкивался с ним в 2008R2, и он долго не фиксился. Вот народ писал через 3 месяца после обещания пофиксить:
|
||||
20 апр 17, 17:01 [20419653] Ответить | Цитировать Сообщить модератору |
SomewhereSomehow Member Откуда: Moscow Сообщений: 2480 Блог |
А, ну ясно, я, видимо, не так тебя понял. Не знал, кстати, про этот баг, спасибо за инфу! (мы пока не напарывались на это). |
||
20 апр 17, 17:07 [20419675] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
мы тоже не напарывались, хотя упорно сидели на 2008 R2 SP1. думаю, давно уже пофиксили ------ говорю только, былo бы особо кривo sys.dm_exec_sql_text, при том огромном числе использующих sp_whoisactive (использующей sys.dm_exec_sql_text), было бы странно не увидеть жалобы в комментариях sp_whoisactive. ведь падение сервера трудно не заметить |
20 апр 17, 17:27 [20419748] Ответить | Цитировать Сообщить модератору |
Eleanor Member Откуда: Сообщений: 3214 |
SomewhereSomehow, Как-то на собеседовании упомянула, что использую sp_whoisactive. В ответ мне сказали, что они не пользуются, потому что это небезопасно. Что они могли иметь в виду? Жаль, не спросила тогда. Из минусов заметила только то, что на перегруженном сервере лучше использовать отдельные dmv, т.к. sp_whoisactive слишком тяжелая, можно не дождаться ответа. |
20 апр 17, 17:29 [20419756] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
мне тоже проще соединить нужное, чем перечислить параметры. 3-4-5 dmv maximum |
||
20 апр 17, 17:32 [20419776] Ответить | Цитировать Сообщить модератору |
a_voronin Member Откуда: Москва Сообщений: 4805 |
a.tarannikova, может это вам понравиться -- This query returns log file space used by all running transactions. select SessionTrans.session_id as [SPID], percent_complete, total_elapsed_time as [Elapsed Time], cpu_time as [CPU Time], wait_type as [Wait Type], wait_time as [Wait Time], wait_resource as [Wait Resource], reads as [Reads], logical_reads as [Logical Reads], writes as [Writes], granted_query_memory as [Query Memory], SUBSTRING(SQLText.text,ExecReqs.statement_start_offset/2,(CASE WHEN ExecReqs.statement_end_offset = -1 then LEN(CONVERT(nvarchar(max), SQLText.text)) * 2 ELSE ExecReqs.statement_end_offset end - ExecReqs.statement_start_offset)/2) AS query_text, database_transaction_log_record_count as [Log Records], database_transaction_log_bytes_used / 1024 as [Log KB Used], database_transaction_log_bytes_reserved / 1024 as [Log KB Reserved], database_transaction_log_bytes_used_system / 1024 as [Log KB Used (System)], database_transaction_log_bytes_reserved_system / 1024 as [Log KB Reserved (System)], database_transaction_replicate_record_count as [Replication Records], enlist_count as [Active Requests], ActiveTrans.transaction_id as [ID], ActiveTrans.name as [Name], ActiveTrans.transaction_begin_time as [Start Time], case transaction_type when 1 then 'Read/Write' when 2 then 'Read-Only' when 3 then 'System' when 4 then 'Distributed' else 'Unknown - ' + convert(varchar(20), transaction_type) end as [Transaction Type], case transaction_state when 0 then 'Uninitialized' when 1 then 'Not Yet Started' when 2 then 'Active' when 3 then 'Ended (Read-Only)' when 4 then 'Committing' when 5 then 'Prepared' when 6 then 'Committed' when 7 then 'Rolling Back' when 8 then 'Rolled Back' else 'Unknown - ' + convert(varchar(20), transaction_state) end as 'State', case dtc_state when 0 then NULL when 1 then 'Active' when 2 then 'Prepared' when 3 then 'Committed' when 4 then 'Aborted' when 5 then 'Recovered' else 'Unknown - ' + convert(varchar(20), dtc_state) end as 'Distributed State', DB.Name as 'Database', database_transaction_begin_time as [DB Begin Time], case database_transaction_type when 1 then 'Read/Write' when 2 then 'Read-Only' when 3 then 'System' else 'Unknown - ' + convert(varchar(20), database_transaction_type) end as 'DB Type', case database_transaction_state when 1 then 'Uninitialized' when 3 then 'No Log Records' when 4 then 'Log Records' when 5 then 'Prepared' when 10 then 'Committed' when 11 then 'Rolled Back' when 12 then 'Committing' else 'Unknown - ' + convert(varchar(20), database_transaction_state) end as 'DB State', command as [Command Type], --open_transaction_count as [Open Transactions], open_resultset_count as [Open Result Sets], row_count as [Rows Returned], nest_level as [Nest Level] from sys.dm_tran_active_transactions ActiveTrans (nolock) inner join sys.dm_tran_database_transactions DBTrans (nolock) on DBTrans.transaction_id = ActiveTrans.transaction_id inner join sys.databases DB (nolock) on DB.database_id = DBTrans.database_id left join sys.dm_tran_session_transactions SessionTrans (nolock) on SessionTrans.transaction_id = ActiveTrans.transaction_id left join sys.dm_exec_requests ExecReqs (nolock) on ExecReqs.session_id = SessionTrans.session_id and ExecReqs.transaction_id = SessionTrans.transaction_id outer apply sys.dm_exec_sql_text(ExecReqs.sql_handle) AS SQLText where SessionTrans.session_id is not null -- comment this out to see SQL Server internal processes --AND DB.Name = 'xxx' |
20 апр 17, 17:52 [20419839] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31785 |
[quote SomewhereSomehow]
Потом я продолжил смотреть, что же случилось - и опять пришлось перезагружать сервер :-) И только потом, погуглив по ошибкам из лога, понял, в чём дело.
Может, там в sp_whoisactive это как то учтено? В баге появление ошибки зависит как бы от порядка обращения к разным dmv То есть, если просто невалидный sql_handle передать в эти функции, то всё нормально, но вот если какой то особенный невалидный, или в каком то порядке... А в sp_whoisactive какие то хинты расставлены в запросах, в общем, колдовство какое то :-)
Обычно самое востребованное - получить, какой стейтмент выполняется в коннектах в данный момент, ну, иногда получить дерево блокировок... |
||||||||
20 апр 17, 19:45 [20420059] Ответить | Цитировать Сообщить модератору |
StarikNavy Member Откуда: Москва Сообщений: 2395 |
ну типа "неизвестный скрипт из интернета, вдруг там прописано if sunday drop all database" |
||
21 апр 17, 12:44 [20421877] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8353 |
В справке по sys.dm_exec_sql_text есть пример, "как текст запроса достать, даже при использовании процедур". |
21 апр 17, 13:14 [20422052] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |