sqlserver如何查询某次数据库操作的耗时

leqi7086 2014-06-27 12:11:46
请教各位达人,我希望查询某段时间内所有数据库操作(比如update,insert)的耗时应该怎么做?我知道oracle是有的,但我在网上怎么也找不到sqlserver有没有这个功能,以及怎么查询。我用的是sqlserver 2008 R2,谢谢各位达人了。
...全文
362 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
leqi7086 2014-06-28
  • 打赏
  • 举报
回复
感谢各位大大了
發糞塗牆 2014-06-27
  • 打赏
  • 举报
回复
MDW 可以试一下,不过配置有点复杂
發糞塗牆 2014-06-27
  • 打赏
  • 举报
回复
profiler是当前运行的情况,要看历史的不能用profiler,而且除非存放到表或者文件上,否则重启sqlserver也会清空信息
leqi7086 2014-06-27
  • 打赏
  • 举报
回复
引用 3 楼 fredrickhu 的回复:
SQL profiler专门用于跟踪的 自己去看看吧。 具体到每一个DDL操作的话 估计有困难
唉...
leqi7086 2014-06-27
  • 打赏
  • 举报
回复
引用 2 楼 ap0405140 的回复:
用SQL Profiler工具跟踪. 或者用MDW数据收集.
查了下,好像都没法查询历史操作,唉
leqi7086 2014-06-27
  • 打赏
  • 举报
回复
引用 7 楼 DBA_Huangzj 的回复:
历史数据是汇总值,比较难查,并且一旦重启服务器,就会清空重新统计,可以用这个语句大概统计一下,如果你真有这方面的需要,应该做好一系列的监控:

--某个库中存储过程平均耗时
SELECT TOP ( 25 )
        p.name AS [SP Name] ,
        qs.total_elapsed_time / qs.execution_count AS [avg_elapsed_time] ,
        qs.total_elapsed_time ,
        qs.execution_count ,
        ISNULL(qs.execution_count / DATEDIFF(Second, qs.cached_time, GETDATE()),
               0) AS [Calls/Second] ,
        qs.total_worker_time / qs.execution_count AS [AvgWorkerTime] ,
        qs.total_worker_time AS [TotalWorkerTime] ,
        qs.cached_time
FROM    sys.procedures AS p WITH ( NOLOCK )
        INNER JOIN sys.dm_exec_procedure_stats AS qs WITH ( NOLOCK ) ON p.[object_id] = qs.[object_id]
WHERE   qs.database_id = DB_ID()
ORDER BY avg_elapsed_time DESC
OPTION  ( RECOMPILE );

--这是普通查询语句的
SELECT  qs.execution_count ,
        qs.total_rows ,
        qs.last_rows ,
        qs.min_rows ,
        qs.max_rows ,
        qs.last_elapsed_time ,
        qs.min_elapsed_time ,
        qs.max_elapsed_time ,
        SUBSTRING(qt.TEXT, qs.statement_start_offset / 2 + 1,
                  ( CASE WHEN qs.statement_end_offset = -1
                         THEN LEN(CONVERT(NVARCHAR(MAX), qt.TEXT)) * 2
                         ELSE qs.statement_end_offset
                    END - qs.statement_start_offset ) / 2) AS query_text
FROM    sys.dm_exec_query_stats AS qs WITH ( NOLOCK )
        CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
ORDER BY qs.execution_count DESC
OPTION  ( RECOMPILE );
感谢版主大大了
發糞塗牆 2014-06-27
  • 打赏
  • 举报
回复
历史数据是汇总值,比较难查,并且一旦重启服务器,就会清空重新统计,可以用这个语句大概统计一下,如果你真有这方面的需要,应该做好一系列的监控:

--某个库中存储过程平均耗时
SELECT TOP ( 25 )
        p.name AS [SP Name] ,
        qs.total_elapsed_time / qs.execution_count AS [avg_elapsed_time] ,
        qs.total_elapsed_time ,
        qs.execution_count ,
        ISNULL(qs.execution_count / DATEDIFF(Second, qs.cached_time, GETDATE()),
               0) AS [Calls/Second] ,
        qs.total_worker_time / qs.execution_count AS [AvgWorkerTime] ,
        qs.total_worker_time AS [TotalWorkerTime] ,
        qs.cached_time
FROM    sys.procedures AS p WITH ( NOLOCK )
        INNER JOIN sys.dm_exec_procedure_stats AS qs WITH ( NOLOCK ) ON p.[object_id] = qs.[object_id]
WHERE   qs.database_id = DB_ID()
ORDER BY avg_elapsed_time DESC
OPTION  ( RECOMPILE );

--这是普通查询语句的
SELECT  qs.execution_count ,
        qs.total_rows ,
        qs.last_rows ,
        qs.min_rows ,
        qs.max_rows ,
        qs.last_elapsed_time ,
        qs.min_elapsed_time ,
        qs.max_elapsed_time ,
        SUBSTRING(qt.TEXT, qs.statement_start_offset / 2 + 1,
                  ( CASE WHEN qs.statement_end_offset = -1
                         THEN LEN(CONVERT(NVARCHAR(MAX), qt.TEXT)) * 2
                         ELSE qs.statement_end_offset
                    END - qs.statement_start_offset ) / 2) AS query_text
FROM    sys.dm_exec_query_stats AS qs WITH ( NOLOCK )
        CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
ORDER BY qs.execution_count DESC
OPTION  ( RECOMPILE );
leqi7086 2014-06-27
  • 打赏
  • 举报
回复
引用 1 楼 DBA_Huangzj 的回复:
set statistics time on; 你的语句 set statistics time off; 或者用sql server profiler来获取
能否查询历史数据?
leqi7086 2014-06-27
  • 打赏
  • 举报
回复
能否查询历史数据?
以学习为目的 2014-06-27
  • 打赏
  • 举报
回复
引用 1 楼 DBA_Huangzj 的回复:
set statistics time on; 你的语句 set statistics time off; 或者用sql server profiler来获取
--小F-- 2014-06-27
  • 打赏
  • 举报
回复
SQL profiler专门用于跟踪的 自己去看看吧。 具体到每一个DDL操作的话 估计有困难
唐诗三百首 2014-06-27
  • 打赏
  • 举报
回复
用SQL Profiler工具跟踪. 或者用MDW数据收集.
發糞塗牆 2014-06-27
  • 打赏
  • 举报
回复
set statistics time on; 你的语句 set statistics time off; 或者用sql server profiler来获取
發糞塗牆 2014-06-27
  • 打赏
  • 举报
回复
log exploer只到2005,连2008都不支持了
leqi7086 2014-06-27
  • 打赏
  • 举报
回复
引用 14 楼 ap0405140 的回复:
[quote=引用 9 楼 leqi7086 的回复:] 查了下,好像都没法查询历史操作,唉
SQL Profiler工具是跟踪未来的.. 历史操作的查询可以分析SQL日志,用LogExplorer工具.[/quote] logexplorer好像不支持2008R2
唐诗三百首 2014-06-27
  • 打赏
  • 举报
回复
引用 9 楼 leqi7086 的回复:
查了下,好像都没法查询历史操作,唉
SQL Profiler工具是跟踪未来的.. 历史操作的查询可以分析SQL日志,用LogExplorer工具.
Andy-W 2014-06-27
  • 打赏
  • 举报
回复
還可以通過sql server 本身的activity monitor去查。

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧