如何侦查SQL执行状态

简介: # 引出问题 随着菜鸟一点点的成熟,现在老鸟已经开始慢慢的将一些问题抛给他:“菜鸟,你去研究下如何有效而快捷的侦查SQL执行状态?”。 “鸟哥,你交代的任务,我分分钟就去办。”,菜鸟领了任务赶紧忙碌起来。 # 分析问题 “其实这个场景经常遇到,比如:我们想知道某个进程的SQL查询执行到哪一步了?当前执行多久了?查询是从哪个登录用户哪一个机器过来的?跑的是什么业务?甚至执行计划是什么

引出问题

随着菜鸟一点点的成熟,现在老鸟已经开始慢慢的将一些问题抛给他:“菜鸟,你去研究下如何有效而快捷的侦查SQL执行状态?”。

“鸟哥,你交代的任务,我分分钟就去办。”,菜鸟领了任务赶紧忙碌起来。

分析问题

“其实这个场景经常遇到,比如:我们想知道某个进程的SQL查询执行到哪一步了?当前执行多久了?查询是从哪个登录用户哪一个机器过来的?跑的是什么业务?甚至执行计划是什么样子?老鸟就是老鸟,总想的比我们远”。菜鸟一边寻思着,一边又马不停蹄的问G哥,终于功夫不负有心人,总算有了点眉目。

解决问题

利用一系列的常见系统视图就可以很轻松的解决这个问题:

  • sys.dm_exec_requests:这个动态视图可以拿到所有于执行请求的信息
  • sys.dm_exec_sql_text:这个动态视图可以拿到执行的语句和当前执行的语句
  • sys.dm_exec_query_plan:这个动态视图可以拿到执行计划

跑在59号进程的测试代码

while 1 = 1
begin
    print 11
    waitfor delay '00:00:01'    
end
AI 代码解读

侦查59号进程的代码如下:

use master
GO
SELECT
    req.session_id
    ,req.start_time
    ,[current_time] = getdate()
    ,ms_since_start = DATEDIFF(ms,req.start_time,GETDATE())
    ,req.percent_complete
    ,req.total_elapsed_time
    ,database_name = db.name
    ,req.status
    ,login_name = suser_name(req.user_id)
    ,pro.hostname
    ,pro.program_name
    ,req.command
    ,req.reads
    ,req.logical_reads
    ,req.writes
    ,req.row_count
    ,transaction_isolation_level = 
        case req.transaction_isolation_level
            when 0 then 'Unspecified'
            when 1 then 'ReadUncomitted'
            when 2 then 'ReadCommitted'
            when 3 then 'Repeatable'
            when 4 then 'Serializable'
            when 5 then 'Snapshot'
            else ''
        end
    ,req.open_transaction_count
    ,st.text
    ,stat = SUBSTRING(st.text, 
                (req.statement_start_offset/2)+1,
                (
                    (CASE req.statement_end_offset 
                        WHEN - 1 THEN DATALENGTH(st.text)
                    ELSE req.statement_end_offset
                    END - req.statement_start_offset)/2
                    ) + 1
            )
    ,qp.query_plan
FROM sys.dm_exec_requests as req WITH(NOLOCK)
CROSS APPLY sys.dm_exec_sql_text(req.sql_handle) st
CROSS APPLY sys.dm_exec_query_plan(req.plan_handle) qp
INNER JOIN sys.databases as db WITH(NOLOCK)
    ON req.database_id = db.database_id
INNER JOIN sys.sysprocesses as pro WITH(NOLOCK)
    ON req.session_id = pro.spid
WHERE session_id = 59
AI 代码解读

执行结果如下(人为分成两段):
_1

_2

补充说明

当然我们也可以使用上一篇文章讲到的SQL Profiler工具。但是,这种方法有个典型的缺点是对被跟踪的SQL Server服务器性能影响较大,不如使用动态视图来得简单方便快捷。

目录
打赏
0
0
0
0
9296
分享
相关文章
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
9月前
|
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
226 13
|
9月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
135 9
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
678 1
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
674 3
|
8月前
|
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
650 0
数据库数据恢复—SQL Server数据库出现逻辑错误的数据恢复案例
SQL Server数据库数据恢复环境: 某品牌服务器存储中有两组raid5磁盘阵列。操作系统层面跑着SQL Server数据库,SQL Server数据库存放在D盘分区中。 SQL Server数据库故障: 存放SQL Server数据库的D盘分区容量不足,管理员在E盘中生成了一个.ndf的文件并且将数据库路径指向E盘继续使用。数据库继续运行一段时间后出现故障并报错,连接失效,SqlServer数据库无法附加查询。管理员多次尝试恢复数据库数据但是没有成功。

相关课程

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等