SPID 和 session_id 之间的差异

Yar*_*lav 3 sql-server t-sql sql-server-2014

我正在配置一个作业以获取违规进程的SPID并将其终止。我正在使用来自@AdamMachanic的伟大sp_Whoiscative和在登录名和 SPID 和session_id值上加入sysprocesses之间的混合,因为这些值应该是相同的(或者我错了,那是我的错误?)。

我得到了一些我不明白的东西:对于来自 sysprocesses的相同SPID,我从 whoisactive 结果中得到不同的 session_id值。这里有什么不正确?

这是我正在使用的代码。在当前日期时间之前 10 秒获取值的过滤器是因为 whoisactive 正在使用参数 @deltainterval 运行,每次运行需要大约 10 秒来执行。

USE master;

--  Log information about current running processes to table Log_WhoIsActive
    EXEC [master].[dbo].[sp_WhoIsActive]
        @get_full_inner_text = 1,
        @get_plans = 2,
        @get_outer_command = 1,
        @get_transaction_info = 1,
        @get_task_info = 2,
        @get_locks = 1,
        @get_avg_time = 1,
        @get_additional_info = 1,
        @delta_interval = 2,
        @sort_order = '[start_time] DESC',
        @destination_table = 'Log_WhoIsActive_tests';

--compare date from sysprocesses with data gathered on sp_whosiactive
SELECT  dt.collection_time, sp.spid, dt.[dd hh:mm:ss.mss], sp.loginame,
        dt.login_name, dt.session_id
FROM    sys.sysprocesses sp JOIN Log_WhoIsActive_tests dt
            ON sp.loginame = dt.login_name
WHERE   sp.loginame = 'my_login_name'
        AND sp.status = 'runnable'
        AND sp.spid > 50
        AND dt.collection_time > DATEADD(ss, -10, GETDATE());
Run Code Online (Sandbox Code Playgroud)

相同 SPID 的不同 session_id

Sol*_*zky 6

SPID === session_id。

您看到的是笛卡尔积,因为您加入的字段在数据集中不是唯一的。您目前拥有:

FROM    sys.sysprocesses sp JOIN Log_WhoIsActive_tests dt
            ON sp.loginame = dt.login_name
Run Code Online (Sandbox Code Playgroud)

您可能至少应该向该 JOIN 添加以下条件:

          AND sp.spid = dt.session_id
Run Code Online (Sandbox Code Playgroud)

另外,请不要使用sysprocesses. 它在 SQL Server 2005 发布时已被弃用,sys.sysprocesses您使用的“表”只是一个兼容性视图。sys.sysprocesses的 MSDN 页面甚至在顶部有一条说明:

此 SQL Server 2000 系统表作为向后兼容性视图包含在内。我们建议您改用当前的 SQL Server 系统视图。要查找等效的系统视图或视图,请参阅将系统表映射到系统视图 (Transact-SQL)。此功能将在 Microsoft SQL Server 的未来版本中删除。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。

您应该改用新的 DMV(动态管理视图):

请注意,登录可能需要被授权的服务器级别的权限VIEW SERVER STATE,以多看少为自己的数据sys.dm_exec_sessionssys.dm_exec_requests,或者看到在所有的东西sys.dm_exec_connections

如果需要这个权限,那么运行该GRANT语句时的当前数据库需要master是服务器级别的权限。