SQL Server用户查询历史记录

时间:2015-12-09 15:39:32

标签: sql sql-server

我需要运行一个查询来提取用户的查询历史记录以确定长时间运行的查询。此信息将每隔5-10分钟提取一次,并存储在一个表中,以便每周生成一份报告,以显示前10个运行时间最长的查询。

我能够找到以下查询,然后添加'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。

非常感谢任何指导/帮助。

谢谢, 弗兰克

2 个答案:

答案 0 :(得分:0)

这就是你要找的东西?

hash: getChecksum(
              key: 'key_value',
              txnid: '4',
              amount: '2000',
              productinfo: 'first sales',
              firstname: 'John',
              email: 'johndepp@gmail.com',
              phone: '123456789',
              surl: 'http://someurl.io',
              furl: 'http://someurl.io')

答案 1 :(得分: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个语句的示例。评论部分用于包含查询计划。