如何侦查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

侦查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

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

补充说明

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

时间: 2024-09-29 05:29:16

如何侦查SQL执行状态的相关文章

MySQL中如何使用profile分析SQL执行状态

打开profile mysql> select @@have_profiling; +------------------+ | @@have_profiling | +------------------+ | YES              | +------------------+ 1 row in set (0.00 sec) mysql> select @@profiling; +-------------+ | @@profiling | +-------------+ |  

高并发下的MySQL解析

工作中进行SQL优化的情况下,常常有这样的问题,SQL已经全部利用索引,请求的数据量较小, 总的数据量不大的情况下,仍有很多慢查询的出现(我们规定是>20ms).这个时候就要关注我们的并发量,事务锁,的情况. 对于游戏来说,DB存在大量的insert .update 可谓玩家的很多动作都会与DB沟通. 本文暂时忽略OS 中的 IO利用率,网卡流量,CPU变化情况,介绍如何查看MySQL部分参数 查看每秒事务数: show global  status like 'com_commit': sho

关于RDS实例CPU超过100%的分析

经常听见用户说自己的rds实例cpu超过100%,通常这种情况都是由于sql性能问题导致的,下面我用一则案例来分析: 用户实例zuowenwang反映cpu超过100%,实例偶尔出现卡住的现象: 1.原理:cpu消耗过大通常情况下都是有慢sql造成的,这里的慢sql包括全表扫描,扫描数据量过大,内存排序,磁盘排序,锁争用等待等: 2.表现现象sql执行状态为:sending data,Copying to tmp table,Copying to tmp table on disk,Sortin

【Oracle】Oracle常用EVENT之三

Event 10710 - Trace Bitmap Index Access 跟踪位图索引的访问情况 ALTER SESSION SET EVENTS '10710 trace name context forever, level 1'; Event 10711 - Trace Bitmap Index Merge Operation 跟踪位图索引合并操作 ALTER SESSION SET EVENTS '10711 trace name context forever, level 1'

SQL Server联机丛书:执行存储过程

server|存储过程|执行 EXECUTE执行标量值的用户定义函数.系统过程.用户定义存储过程或扩展存储过程.同时支持 Transact-SQL 批处理内的字符串的执行 若要唤醒调用函数,请使用 EXECUTE stored_procedure 中描述的语法.语法执行存储过程:[ [ EXEC [ UTE ] ]     {          [ @return_status = ]             { procedure_name [ ;number ] | @procedure_n

SQL Server 2008安装过程中出现1608错误的解决办法

一直使用SQL Server 2000 ,觉得安装方便快速,便不想升级到2005/2008.今天有个项目突然要用到2008,于是就在Windows7下安装了一下,没想到碰到一个1608 错误,中间提示一大堆信息,上网搜索了一下,也好多遇到过这个错误,试了网上的方法都没有成功,郁闷中搜索到一个国外的方法:   SQL Server 2008 Setup fails on Windows 7 Enterprise, Error code 1608 To troubleshooting the iss

查看MSSQL 执行过程中执行状态

  创建一个存储过程:dba_WhatSQLIsExecuting 然后执行这个存储过程就可以查看相关的信息了. MS SQL 执行过程中执行状态,可查看当前正在执行的sql等信息 当前执行到哪句SQL,等,这个可以帮助长时间的SQL执行做进度条. USE [RMA_DWH] GO /****** Object: StoredProcedure [dbo].[dba_WhatSQLIsExecuting] Script Date: 07/12/2013 10:28:27 ******/ SET

Oracle Advanced Support系统SQL注入漏洞挖掘经验分享

Oracle Advanced Support系统SQL注入漏洞分析 一年多前我在客户的一个外部环境中执行渗透测试,任何外部环境渗透测试的重要步骤之一就是挖掘出可访问的WEB服务.nmap和EveWitness的结合会令这步骤变得更快,因为我们可以进行端口扫描 并且把这些结果以屏幕截图的形式导入到 EyeWitness中.当梳理完 EyeWitness提供的屏幕截图页面后,我发现了一个Oracle 高级支持服务. 虽然我之前从没听过Oracle Advanced Support,但是当我很快的g

MS SQL 日志记录管理

    MS SQL的日志信息/日志记录,可能对你来说,既熟悉又陌生,熟悉是因为你可能一直都在使用,查看.关注一些日志信息/记录,例如,作业历史记录:陌生是因 为你可能从不关注日志信息/记录的管理,这里我一直用日志信息/记录这个词,而没有用日志文件这个词来阐述,是想让大家把它和事务日志文件(ldf)区分 开来,网上你用日志文件做搜索关键词,可能搜出来的都是事务日志相关的信息.其实它真的也叫日志文件,这篇文章我大概从日志记录分类.如何查看日志记录. 日志记录的位置.日志记录的设置.为什么错误日志会