【问题标题】:SQL Server user query historySQL Server 用户查询历史记录
【发布时间】:2015-12-09 15:39:32
【问题描述】:

我需要运行一个查询来提取用户查询历史以确定长时间运行的查询。该信息将每 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。

任何指导/帮助将不胜感激。

谢谢, 弗兰克

【问题讨论】:

标签: sql sql-server


【解决方案1】:

这就是你要找的东西?

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;

【讨论】:

  • 我能够在线找到以下查询,然后添加了 sys.dm_exec_sessions 视图:
【解决方案2】:

您可能想查看计划缓存。它包含有关现在缓存中的所有计划的统计信息,因此它应该包含大多数最近的昂贵查询,以及相当多的旧查询。你可以这样做:

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 条语句的示例。注释部分用于包含查询计划。

【讨论】:

  • 我找到了一个,然后使用 sys.dm_exec_sessions 在 sys.dm_exec_requests 表中添加了一个左外连接。它似乎返回了我需要的东西,但只返回了活动会话?
猜你喜欢
  • 2011-07-15
  • 2018-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多