none
SQL SERVER 2008 R2 SP2报错信息“等待闩锁时出现超时” RRS feed

  • 问题

  • 使用SQL SERVER 2008 R2 SP2时报错,错误信息如下:等待闩锁时出现超时: 类 'ACCESS_METHODS_DATASET_PARENT',id 0000000A67DCE878,类型 4,任务 0x0000000E18C16508 : 28,等待时间 600,标志 0x1a,所属任务 0x0000000CB63F02C8。将继续等待。

    请问如何解决

    2013年10月22日 13:14

答案

  • 我这里有比较少的宋云剑演讲资料

    症状和解决方案-ACCESS_METHOD_XX
    可能是

    ACCESS_METHOD_DATASET_PARENT
    ACCESS_METHOD_SCAN_RANGE_GENERATOR
    ACCESS_METHOD_HOBT_VIRTUAL_ROOT
    前两个用于并行扫描,非常常见
    第三种用于页根节点分裂
    这意味着
    更多分析

    分析执行计划缓存,看是否存在大量扫描和HASH操作
    查看存在大量页分裂的索引
    参考处理并行执行计划
    想办法减少页分裂

    宋沄剑 SQLSERVER等待的分析

    2013年10月23日 5:55
  • 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'

    2013年10月26日 5:46

全部回复

  • Did you see blocking on the server?
    2013年10月22日 16:05
  • 查询一下Master.dbo.SysProcesses,有什么进程阻塞,再跟踪其最后运行的SQL

    Try SQL Server 2008 QQ:315054403 dgdba@hotmail.com

    2013年10月23日 0:47
  • 这个'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.


    2013年10月23日 1:16
  • 楼上两个说block都该打板子。

    跟IO有关的可能性也不大。也许和内存有关。另外检查表上有没有聚集索引。


    想不想时已是想,不如不想都不想。

    2013年10月23日 4:10
    版主
  • 为什么跟内存有关?

    Please Mark As Answer if it is helpful.

    2013年10月23日 5:29
  • 我这里有比较少的宋云剑演讲资料

    症状和解决方案-ACCESS_METHOD_XX
    可能是

    ACCESS_METHOD_DATASET_PARENT
    ACCESS_METHOD_SCAN_RANGE_GENERATOR
    ACCESS_METHOD_HOBT_VIRTUAL_ROOT
    前两个用于并行扫描,非常常见
    第三种用于页根节点分裂
    这意味着
    更多分析

    分析执行计划缓存,看是否存在大量扫描和HASH操作
    查看存在大量页分裂的索引
    参考处理并行执行计划
    想办法减少页分裂

    宋沄剑 SQLSERVER等待的分析

    2013年10月23日 5:55
  • 如果是IO有关,通常不会超时。但是内存不足可能放不出来。

    没有聚集索引的时候,更容易出问题。

    不过这都只是估计,没有更详细的信息。


    想不想时已是想,不如不想都不想。

    2013年10月23日 8:55
    版主
  • 类型4 –EX,奇怪为什么600s还没释放?你的SQL Server error log 应该有Dump吧?可以发出来看看?另外这个错误出现之前是否有其他错误信息?比如IO问题之类的?

     


    Please Mark As Answer if it is helpful.


    2013年10月23日 9:19
  • 如果是IO有关,通常不会超时。但是内存不足可能放不出来。

    没有聚集索引的时候,更容易出问题。

    不过这都只是估计,没有更详细的信息。


    想不想时已是想,不如不想都不想。

    怡红公子大侠说的是对的,LZ没有给出更详细的错误信息,我们也只能给出大概的解决范围
    2013年10月23日 9:20
  • 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'

    2013年10月26日 5:46
  • 第三步:根据错误信息确定是哪一个表

    使用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)

    2013年10月26日 5:50
  • 这里需要将allocation unit Id:0000000A67DCE878  转换为十进制

    SELECT * FROM sys.allocation_units where allocation_unit_id= aaaaaaaa

    2013年10月26日 5:55