如何知道TSQL语句已经运行了多久
来源:互联网 发布:js关闭当前页面且跳转 编辑:程序博客网 时间:2024/04/29 18:59
一个常见的想法是,能否能够知道目前还在运行的TSQL 语句已经运行了多久呢? 你可以使用SQL server profiler 捕获语句的开始时间,和现在的时间比较就可以知道已经运行多久了。但是Profiler有时候可能带来一些性能影响。下面介绍如何利用DMV 来得到语句已经运行了多久。
在SQL server 2005/SQL server 2008 里面有个DMV, sys.dm_exec_requests. 该DMV里面有个 重要的字段start_time, 该字段表示request 开始的时间。一个TSQL Batch就是一个request, 一个request 一般对应一个 task. 如果batch是并发执行,那么对应多个tasks. 我下面的script 不考虑并发执行的情况。在DMV sys.dm_os_workers 里面有个字段task_bound_ms_ticks, 表示工者线程(worker)拿到task 的时间(单位是tick)。
sys.dm_exec_requests 里面没有包括语句的文本。下面的脚本通过sql_handle 从sys.dm_exec_sql_text 里面得到语句文本,从sys.dm_exec_query_plan里得到执行计划。脚本还输出现在正在执行的是哪一句具体的stmt。这对于一个batch 包括多条语句的时候特别有用,stmt 告诉我们现在执行的是那条具体的SQL语句。
脚本如下:
declare @ms_per_tickdecimal(10,6)--millisecond per tick
select @ms_per_tick=1.0*datediff(millisecond, sqlserver_start_time ,getdate())/(ms_ticks-sqlserver_start_time_ms_ticks)FROM sys.[dm_os_sys_info];
--select @ms_per_tick
select req.session_id,
req.start_time request_start_time,
((select ms_ticks from sys.dm_os_sys_info)-workers.task_bound_ms_ticks )*@ms_per_tick'ms_since_task_bound',
DATEDIFF(ms,req.start_time,getdate()) 'ms_since_request_start',
tasks.task_state,workers.state worker_state,req.status request_state,
st.text,
SUBSTRING(st.text, (req.statement_start_offset/2)+1,
((CASE req.statement_end_offset
WHEN -1 THENDATALENGTH(st.text)
ELSE req.statement_end_offset
END - req.statement_start_offset)/2) + 1) AS stmt
,qp.query_plan
,req.*
from
sys.dm_exec_requests req
left join sys.dm_os_tasks tasks
on tasks.task_address=req.task_address
left join sys.dm_os_workers workers
on tasks.task_address=workers.task_address
CROSS APPLY sys.dm_exec_sql_text(req.sql_handle) st
CROSS APPLY sys.dm_exec_query_plan(req.plan_handle) qp
where (req.session_id >50 or req.session_id is null)
go
注意上面的@ms_per_tick用来计算一个tick 相当于多少ms(毫秒), 一般而言,一个tick 基本就是一个毫秒。脚本输出的结果类似如下:
上面的例子可以看到,spid 52 的batch开始的时间是2011-03-21 16:46:06.817, 已经运行了242610毫秒,batch是”create procedure usp_myi…” , 运行的语句是select * from master..sysprocesses,状态是RUNNING.
- 如何知道TSQL语句已经运行了多久
- 如何知道TSQL语句已经运行了多久
- DBA工具——DMV——如何知道TSQL语句已运行了多久
- 获取SP运行花费时间最长前10位/TSQL语句已经运行了多久
- Linux运行了多久?
- C语言中如何查看程序运行了多久?
- marathon如何查看一个container运行了多久
- 如何知道Hibernate已经成功运用了二级缓存EhCache
- Linux运行了多久?&&gettimeofday()的用法
- java如何确定某个语句执行多久?
- 如何检测系统是否已经运行了相同的程序。
- 如何检测系统是否已经运行了相同的程序
- TSQL WHEN语句
- TSQL语句练习题
- 如何知道一个进程运行了多少个实例?
- 如何知道一个进程运行了多少个实例?
- IE7还没有用多久,IE8已经出来了,微软明显加快了步伐了!!
- 怎么知道java多线程已经运行结束
- Cookie原理与运用
- SAP 登陆界面菜单文本修改 (Modification of SAP Logon Menu text)
- 设计模式之Observer
- Android教程之实现动作感应技术
- SAP登陆界面TITLE修改方法(Method of SAP Logon GUI Title Modification)
- 如何知道TSQL语句已经运行了多久
- 浅析视频搜索中的清晰度识别过程
- 硅谷就是这样
- AsyncTask 学习
- swing 禁止同时打开两个相同主窗体
- disable just-in-time (JIT) debugging的两个方法
- ibatis事务管理器和数据源
- ContentProvider、ContentValues、ContentResolver、ContentObserver
- Android Application context/Activity context与内存泄露