SqlServer Bug:扩展存储过程一直运行出现等待类型PREEMPTIVE_OS_GETPROCADDRESS

今天使用xp_readerrorlog第一次在新服务器查询一个死锁信息,结果一直在运行,即使kill了也一直在运行:

(分别在2个服务器实例中运行,其中一个已经kill)

exec xp_readerrorlog 0,1,NULL,NULL,'2015-01-07 22:13:10','2015-01-07 22:13:11','ASC'

而下面这个执行是正常的,结果很快出来:

exec xp_readerrorlog 0,1,'deadlock victim',NULL,'2015-04-01','2015-04-10','desc'

操作系统: Microsoft
Windows Server 2008 R2 Enterprise  (64) Service
Pack 1

SqlServer:Microsoft
SQL Server 2008 (RTM) Microsoft Corporation  Enterprise Edition (64-bit) (Build 7601: Service Pack 1)

select p.spid,p.waittime,p.lastwaittype,p.cpu,p.open_tran,p.status,p.cmd,s.text
from master.dbo.sysprocesses p cross apply sys.dm_exec_sql_text(p.sql_handle) s
where spid=55
--where spid=374 --haved killed

发现该session的执行时间,CPU一直累增,而且一直在运行。

找到一篇文章:Why does PREEMPTIVE_OS_GETPROCADDRESS Show a Large Accumulation?

说是SqlServer 2008 的一个bug,是执行扩展存储过程导致类型PREEMPTIVE_OS_GETPROCADDRESS不断地累计时间。

按上面所说的,计算扩展存储过程执行的大致时间:

declare @WaitTime bigint
select @WaitTime = wait_time_ms from sys.dm_os_wait_stats where wait_type = 'MSQL_XP'
select @WaitTime - wait_time_ms from sys.dm_os_wait_stats where wait_type = 'PREEMPTIVE_OS_GETPROCADDRESS'

2个实例的结果也只有不到300毫秒。而且,等待类型PREEMPTIVE_OS_GETPROCADDRESS当前并没有增加。

select * from sys.dm_os_wait_stats where wait_type='PREEMPTIVE_OS_GETPROCADDRESS'

没有增加,两种可能的结果:

1. 扩展存储过程执行完了;

2. 扩展存储过程仍然在执行(因为正在执行时,数据是没有计算到DMV中的)

下面执行了一批的查询,发现该session都是正在运行中的,task、thread、work都是在运行同一个对象。

select * from sys.dm_exec_sessions where session_id=55
select * from sys.dm_exec_connections where session_id=55
select * from sys.dm_exec_requests where session_id=55
select * from sys.dm_os_tasks where task_address=0x00000000005DD948 and session_id=55
select * from sys.dm_os_workers where worker_address=0x00000008B58FC1A0
select * from sys.dm_os_threads where thread_address=0x000007FFFFF594A8

到底是不是bug?是不是还在运行?怎么撤销?难道要重启SqlServer服务才能解决?

(当前状态仍是上面的图一样,只是时间、CPU在不断增加。仍在寻找答案!~)

时间: 2024-10-15 04:55:15

SqlServer Bug:扩展存储过程一直运行出现等待类型PREEMPTIVE_OS_GETPROCADDRESS的相关文章

sqlserver 只有函数和扩展存储过程才能从函数内部执行

一个SQLServer的自定义函数中调用一个自定义的存储过程,执行此函数后发出如下提示:“只有函数和扩展存储过程才能从函数内部执行". 原因:函数只能使用简单的sql语句,逻辑控制语句,复杂一点的存储过程是不能调用的,在函数里也不能使用execute  sp_executesql  或者execute .解决方法把函数改为存储过程,然后在另一个存储过程中象调用函数一样使用此存储过程就可以了. 下面是一个存储过程调用另一个存储过程的实例,有参数传递的. --存储过程sp_B    create 

SqlServer扩展存储过程

1. 扩展存储过程xp_cmdshell用法: --1.启用 SP_CONFIGURE 'show advanced options',1 RECONFIGURE GO SP_CONFIGURE 'xp_cmdshell',1 RECONFIGURE GO --2.用法 master..xp_cmdshell 'DIR D:\' --3.关闭 SP_CONFIGURE 'xp_cmdshell', 0 RECONFIGURE GO SP_CONFIGURE 'show advanced opti

SQLServer分页查询存储过程

项目中用到的SQLServer分页查询存储过程. [存储过程] create PROCEDURE prcPageResult -- 获得某一页的数据 -- @currPage int = 1,                         --当前页页码 (即Top currPage) @showColumn varchar(2000) = '*',           --需要得到的字段 (即 column1,column2,......) @strCondition varchar(200

JAVA使用JDBC技术操作SqlServer数据库执行存储过程

Java使用JDBC技术操作SqlServer数据库执行存储过程: 1.新建SQLSERVER数据库:java_conn_test 2.新建表:tb_User 3.分别新建三个存储过程: 1>带参数的新增用户存储过程: CREATE PROCEDURE [dbo].[p_Insert_User] @name nvarchar(50), @UserPwd nvarchar(50) AS BEGIN INSERT INTO tb_User VALUES(NEWID(),@name,@UserPwd)

SqlServer性能急剧下降,查看所有会话的状态及等待类型---Latch_Ex

当某个数据库文件空间用尽,做自动增长的时候,同一时间点只能有一个用户人员可以做文件自动增长动作,其他任务必须等待,此时会出现Latch资源的等待.使用sp_helpdb查看业务数据库时发现:该数据库设置不合理,数据文件每次增长2M,日志文件每次增长10%,且分别设置了最大限制.修改为每次增长200M,不限制大小,系统恢复正常,问题解决. SqlServer阻塞时的等待类型如下: 顺便整理一下查看阻塞.会话状态及等待类型的SQL脚本: -- 查看SQL阻塞信息 with tmp as ( sele

sql server 各种等待类型-转

等待的类型 资源等待 当某个工作线程请求访问某个不可用的资源(因为该资源正在由其他某个工作线程使用,或者该资源尚不可用)时,便会发生资源等待.资源等待的示例包括锁等待.闩锁等待.网络等待以及磁盘 I/O 等待.锁等待和闩锁等待是指等待同步对象 队列等待 当工作线程空闲,等待分配工作时便会发生队列等待.队列等待通常发生在系统后台任务(如监视死锁以及清除已删除的记录等任务)中.这些任务将等待工作请求被放入工作队列.即使没有新数据包放入队列,队列等待也可能定期处于活动状态. 外部等待 当 SQL Se

sql server等待类型

等待的类型 资源等待 当某个工作线程请求访问某个不可用的资源(因为该资源正在由其他某个工作线程使用,或者该资源尚不可用)时,便会发生资源等待.资源等待的示例包括锁等待.闩锁等待.网络等待以及磁盘 I/O 等待.锁等待和闩锁等待是指等待同步对象 队列等待 当工作线程空闲,等待分配工作时便会发生队列等待.队列等待通常发生在系统后台任务(如监视死锁以及清除已删除的记录等任务)中.这些任务将等待工作请求被放入工作队列.即使没有新数据包放入队列,队列等待也可能定期处于活动状态. 外部等待 当 SQL Se

[AlwaysOn Availability Groups]AlwaysOn等待类型

AlwaysOn等待类型 当排查AlwaysOn延迟,等待统计信息可以在DMV中查看累计的AlwaysOn等待类型. 查看AlwaysOn等待类型 SELECT * FROM sys.dm_os_wait_stats WHERE wait_type LIKE '%hadr%' ORDER BY wait_time_ms DESC 使用一下语句,获取捕获扩展事件,等待类型. CREATE EVENT SESSION [alwayson] ON SERVER ADD EVENT sqlos.wait

SqlServer将日期格式DateTime转换成varchar类型

Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM Select CONVERT(varchar(100), GETDATE(), 1): 05/16/06 Select CONVERT(varchar(100), GETDATE(), 2): 06.05.16 Select CONVERT(varchar(100), GETDATE(), 3): 16/05/06 Select CONVERT(varchar(100),