积极答复者
SQL SERVER 2008 R2 SP2报错信息“等待闩锁时出现超时”

问题
答案
-
我这里有比较少的宋云剑演讲资料
症状和解决方案-ACCESS_METHOD_XX
可能是
ACCESS_METHOD_DATASET_PARENT
ACCESS_METHOD_SCAN_RANGE_GENERATOR
ACCESS_METHOD_HOBT_VIRTUAL_ROOT
前两个用于并行扫描,非常常见
第三种用于页根节点分裂
这意味着
更多分析
分析执行计划缓存,看是否存在大量扫描和HASH操作
查看存在大量页分裂的索引
参考处理并行执行计划
想办法减少页分裂- 已标记为答案 Michelle GeModerator 2013年11月6日 2:05
-
LZ您好,下次您遇到同样问题可以这样分析:
因为您没有给出更详细的信息,我们只能给出解决步骤了
我们可以查询下面的语句了解一下具体的等待种类:
Latch(闩锁)的等待类型主要有三种。
1.Buffer (BUF) Latch. 用来保护索引或数据页。也包括PFS, GAM, SGAM和IAM数据页。等待类型是PAGELATCH_*模式
2.Non-buffer(Non-BUF) Latch, 除了上述数据结构以外的其他内存结构。等待类型是LATCH_*模式
3.IO Latch, 保护数据从磁盘到页面的读写过程,等待类型是PAGEIOLATCH_*模式
第一步:是哪一种 Latch(闩锁)
SELECT * FROM sys.dm_os_wait_stats WHERE wait_type like '%Latch%'
比如:A time-out occurred while waiting for buffer latch -- type 4, bp 000000097BFDEDC0, page 1:19239, stat 0xc00009, database id: 5, allocation unit Id: 72057615247867904, task 0x0000000005E594C8 : 0, waittime 300, flags 0x1018, owning task 0x0000000000169DC8. Not continuing to wait.
-------------------------------------------------------------------------------------------------------
第二步:是哪一种类型
id 0000000A67DCE878,类型 4,任务 0x0000000E18C16508 : 28
类型 4 是等待的类型。通过下面的查询,我们可以知道, type为4的Latch是EX模式
SELECT * FROM sys.dm_xe_map_values where name = 'latch_mode'
- 已标记为答案 Michelle GeModerator 2013年11月6日 2:05
全部回复
-
这个'ACCESS_METHODS_DATASET_PARENT'在并行扫描的时候出现的。你看一下是否有CXPACKET 之类的Wait,或者PAGEIOLATCH_XX 之类的。
如果CXPACKET 可以尝试更改成不用并行计划(query option or MAXDOP ),如果是PAGEIOLATCH_XX之类的查一下是否有IO瓶颈,是否可以减少IO的操作(比如通过索引)
Please Mark As Answer if it is helpful.
- 已编辑 KevinLiu328 2013年10月23日 1:17 修改
-
我这里有比较少的宋云剑演讲资料
症状和解决方案-ACCESS_METHOD_XX
可能是
ACCESS_METHOD_DATASET_PARENT
ACCESS_METHOD_SCAN_RANGE_GENERATOR
ACCESS_METHOD_HOBT_VIRTUAL_ROOT
前两个用于并行扫描,非常常见
第三种用于页根节点分裂
这意味着
更多分析
分析执行计划缓存,看是否存在大量扫描和HASH操作
查看存在大量页分裂的索引
参考处理并行执行计划
想办法减少页分裂- 已标记为答案 Michelle GeModerator 2013年11月6日 2:05
-
类型4 –EX,奇怪为什么600s还没释放?你的SQL Server error log 应该有Dump吧?可以发出来看看?另外这个错误出现之前是否有其他错误信息?比如IO问题之类的?
Please Mark As Answer if it is helpful.
- 已编辑 KevinLiu328 2013年10月23日 9:25
-
LZ您好,下次您遇到同样问题可以这样分析:
因为您没有给出更详细的信息,我们只能给出解决步骤了
我们可以查询下面的语句了解一下具体的等待种类:
Latch(闩锁)的等待类型主要有三种。
1.Buffer (BUF) Latch. 用来保护索引或数据页。也包括PFS, GAM, SGAM和IAM数据页。等待类型是PAGELATCH_*模式
2.Non-buffer(Non-BUF) Latch, 除了上述数据结构以外的其他内存结构。等待类型是LATCH_*模式
3.IO Latch, 保护数据从磁盘到页面的读写过程,等待类型是PAGEIOLATCH_*模式
第一步:是哪一种 Latch(闩锁)
SELECT * FROM sys.dm_os_wait_stats WHERE wait_type like '%Latch%'
比如:A time-out occurred while waiting for buffer latch -- type 4, bp 000000097BFDEDC0, page 1:19239, stat 0xc00009, database id: 5, allocation unit Id: 72057615247867904, task 0x0000000005E594C8 : 0, waittime 300, flags 0x1018, owning task 0x0000000000169DC8. Not continuing to wait.
-------------------------------------------------------------------------------------------------------
第二步:是哪一种类型
id 0000000A67DCE878,类型 4,任务 0x0000000E18C16508 : 28
类型 4 是等待的类型。通过下面的查询,我们可以知道, type为4的Latch是EX模式
SELECT * FROM sys.dm_xe_map_values where name = 'latch_mode'
- 已标记为答案 Michelle GeModerator 2013年11月6日 2:05
-
第三步:根据错误信息确定是哪一个表
使用SQL SERVER 2008 R2 SP2时报错,错误信息如下:
等待闩锁时出现超时: 类 'ACCESS_METHODS_DATASET_PARENT',
id 0000000A67DCE878,类型 4,任务 0x0000000E18C16508 : 28,
等待时间 600,标志 0x1a,所属任务 0x0000000CB63F02C8。将继续等待。我估计id 0000000A67DCE878就是allocation unit Id
可以对比一下我给出的例子
A time-out occurred while waiting for buffer latch --
type 4, bp 000000097BFDEDC0, page 1:19239, stat 0xc00009, database id: 5,
allocation unit Id: 72057615247867904, task 0x0000000005E594C8 : 0,
waittime 300, flags 0x1018, owning task 0x0000000000169DC8. Not continuing to wait.根据allocation_unit_id查出partition_id
结果中的container_id就是partition_id
SELECT * FROM sys.allocation_units where allocation_unit_id= '0000000A67DCE878'
查出partition_id之后得到object_id
SELECT * FROM sys.partitions where partition_id = xxxx得到表名:name列
SELECT * FROM sys.objects where object_id = yyyy另外:要求每次碰到Latch Timeout,都要生成一个内存转储,我们可以用traceflag 838,
如下面的命令:
dbcc traceon(838, -1)