是否有一种方法列出当前在MS SQL Server上运行的查询(无论是通过企业管理器还是SQL)和/或谁连接?

我想我有一个很长时间运行的查询正在我的一个数据库服务器上执行,我想跟踪它并停止它(或不断启动它的人)。


当前回答

您可以运行sp_who命令来获取当前所有用户、会话和进程的列表。然后你可以对任何阻挡其他蜘蛛运行KILL命令。

其他回答

您可以运行sp_who命令来获取当前所有用户、会话和进程的列表。然后你可以对任何阻挡其他蜘蛛运行KILL命令。

使用Sql Server Profiler(工具菜单)监视正在执行的查询,并使用Management studio中的活动监视器查看如何连接以及他们的连接是否阻塞其他连接。

试图把事情放在一起(希望有帮助):

SELECT
    p.spid,
    RIGHT(CONVERT(varchar, DATEADD(ms, DATEDIFF(ms, p.last_batch, GETDATE()), '1900-01-01'), 121), 12) AS [batch_duration],
    p.[program_name],
    p.hostname,
    MAX(p.loginame) AS loginame,
    (SELECT SUBSTRING(text, COALESCE(NULLIF(spid.stmt_start, 0), 1) + 1, CASE spid.stmt_end WHEN -1 THEN DATALENGTH(text) ELSE (spid.stmt_end - spid.stmt_start) END) FROM ::fn_get_sql(spid.[sql_handle])) AS [sql]
FROM
    master.dbo.sysprocesses p
    LEFT JOIN (
        SELECT
            ROW_NUMBER() OVER(PARTITION BY spid ORDER BY ecid) AS i,
            spid,
            [sql_handle],
            CASE stmt_start WHEN 0 THEN 0 ELSE stmt_start / 2 END AS stmt_start,
            CASE stmt_end WHEN -1 THEN -1 ELSE stmt_end / 2 END AS stmt_end
        FROM sys.sysprocesses
    ) spid ON p.spid = spid.spid AND spid.i = 1
WHERE
    p.spid > 50
    AND p.status NOT IN ('background', 'sleeping')
    AND p.cmd NOT IN ('AWAITING COMMAND', 'MIRROR HANDLER', 'LAZY WRITER', 'CHECKPOINT SLEEP', 'RA MANAGER')
GROUP BY
    p.spid,
    p.last_batch,
    p.[program_name],
    p.hostname,
    spid.stmt_start,
    spid.stmt_end,
    spid.[sql_handle]
ORDER BY
    batch_duration DESC,
    p.spid
;

实际上,在Query Analyzer / Management Studio中运行EXEC sp_who2比sp_who提供更多的信息。

除此之外,您还可以设置SQL Profiler来监视到服务器的所有进出流量。Profiler还可以让您缩小您正在观看的内容。

SQL Server 2008:

START - All Programs - Microsoft SQL Server 2008 - Performance Tools - SQL Server Profiler

请记住,分析器实际上是一个记录和监视应用程序。只要它在运行,它就会继续记录和监视。它可能会填满文本文件、数据库或硬盘驱动器,所以要小心你让它看什么,看多长时间。

注意,SQL Server 2008的SQL Server活动监控器可以通过右键单击当前服务器并在上下文菜单中转到“活动监控器”来找到。我发现如果使用SQL Server Management Studio,这是杀死进程最简单的方法。