2015-12-09 6 views
2

Мне нужно запустить запрос, который тянет историю запросов пользователей, чтобы определить длинные запросы. Эта информация будет вытаскиваться каждые 5-10 минут и хранится в таблице для еженедельного отчета, который будет отображаться с 10 самыми длинными работающими запросами.История запросов пользователя SQL Server

Мне удалось найти следующий запрос, а затем добавить «SYS.DM_EXEC_SESSIONS», который, как представляется, возвращает то, что мне нужно. Однако кажется, что это не история, а только активные сеансы. Мне определенно нужно имя пользователя, имя хоста и база данных как часть набора результатов.

SELECT 
r.session_id 
, s.login_name 
, s.host_name 
, r.start_time 
, TotalElapsedTime_ms = r.total_elapsed_time 
, r.[status] 
, s.program_name 
, r.command 
, DatabaseName = DB_Name(r.database_id) 
, 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] 
FROM 
sys.dm_exec_requests r 
LEFT OUTER JOIN 
sys.dm_exec_sessions s 
ON 
r.session_id = s.session_id 
CROSS APPLY 
sys.dm_exec_sql_text(r.sql_handle) AS t 
CROSS APPLY 
sys.dm_exec_query_plan(r.plan_handle) AS p 
ORDER BY 
r.total_elapsed_time DESC; 

До сих пор я был в состоянии вывести информацию о сеансе из SYS.DM_EXEC_SESSIONS, но я не могу найти любые мнения, чтобы связать с статистики запросов. База данных - это SQL Server 2012 SP1.

Любое руководство/помощь будет принята с благодарностью.

Спасибо, Frank

+0

Возможный дубликат [Есть ли способ просмотра последних дорогостоящих запросов в Sql Server 2005?] (Http://stackoverflow.com/questions/24896483/is-there-a-way-for-viewing-the- Недавний-дорогой-query-in-sql-server-2005) – Tanner

ответ

0

Это то, что вы ищете?

SELECT loginame AS LoginName , 
     sqltext.TEXT , 
     req.session_id , 
     req.status , 
     req.command , 
     req.cpu_time , 
     req.total_elapsed_time 
FROM sys.dm_exec_requests req 
     CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS sqltext 
     JOIN sys.sysprocesses s ON s.spid = session_id; 
+0

Я смог найти ниже запрос онлайн, а затем добавил представление sys.dm_exec_sessions: –

0

Возможно, вы захотите изучить кеш плана. Он содержит статистику обо всех тех планах, которые находятся в кеше прямо сейчас, поэтому он должен содержать большинство последних дорогостоящих запросов, а также довольно много старых. Вы можете сделать это с чем-то вроде этого:

select top 100 
SUBSTRING(t.text, (s.statement_start_offset/2)+1, 
((CASE s.statement_end_offset 
WHEN -1 THEN DATALENGTH(t.text) 
ELSE s.statement_end_offset 
END - s.statement_start_offset)/2) + 1) as statement_text, 
t.text, 
s.total_logical_reads, 
s.total_logical_reads/s.execution_count as avg_logical_reads, 
s.total_worker_time, 
s.total_worker_time/s.execution_count as avg_worker_time, 
s.execution_count, 
creation_time, 
last_execution_time 
--,cast(p.query_plan as xml) as query_plan 
from sys.dm_exec_query_stats s 
cross apply sys.dm_exec_sql_text (sql_handle) t 
--cross apply sys.dm_exec_text_query_plan (plan_handle, statement_start_offset, statement_end_offset) p 
order by s.total_logical_reads desc 

Это просто пример, который показывает лучшие 100 заявлений логического чтения. Прокомментированная часть предназначена для включения планов запросов.

+0

Мне удалось найти его, а затем добавить LEFT OUTER JOIN в sys .dm_exec_requests таблица с sys.dm_exec_sessions. Кажется, он возвращает то, что мне нужно, но только активные сеансы? –

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