博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Timeout occurred while waiting for latch: class 'ACCESS_METHODS_DATASET_PARENT'
阅读量:4700 次
发布时间:2019-06-09

本文共 1488 字,大约阅读时间需要 4 分钟。

前些天某个SQL Server数据库的错误日志爆出如下错误:

Timeout occurred while waiting for latch: class 'ACCESS_METHODS_DATASET_PARENT', id 00000009A5670C58, type 4, Task 0x0000000B655BC508 : 188, waittime 300, flags 0x1a, owning task 0x00000000170DC748. Continuing to wait.

第一感觉是并行查询的问题,于是翻笔记查看'ACCESS_METHODS_DATABASE_PARENT'到底是什么等待事件,可以参考的官网解释来了解一二。

ACCESS_METHODS_DATASET_PARENT -- Used to synchronize child dataset access to the parent dataset during parallel operations.

官网的解释比较含糊,其实这个等待事件的本质是:SQL Server在执行TotalsSubTree超过查询阈值cost(默认为5)的SQL时会使用并行来完成,即多个threads并行完成一个SQL的查询,这样就需要各个线程进行信息交互以便实现一致性,如果SQL执行的时间很长,那么就需要长时间的获取latch,因此产生这种等待事件,其本质还是因为SQL太烂引起的,需要进行SQL优化。

写SQL来抓取引发问题的业务SQL,为方便起见创建为sp存储过程:

USE [master]GOSET QUOTED_IDENTIFIER ONGOCREATE procedure [dbo].[sp_findtask](@parent_task_address varbinary(8))as BEGINSELECT t.spid,t.lastwaittype,t.open_tran,t.status,t.hostname,t.program_name,t.loginame,dc.text FROM master.sys.sysprocesses t cross apply master.sys.dm_exec_sql_text(t.sql_handle) dcWHERE spid in (select distinct session_id from sys.dm_os_tasks where parent_task_address=@parent_task_address)ENDGO

涉及到的几个视图:sys.sysprocesses,sys.dm_os_tasks都可以通过官网查到相关列的说明,这里不再详述。对于SQLOS任务调度涉及的概念参考:

这样下次出现问题,只要能从错误日志中快速找到owning task的address(就是sys.dm_os_tasks中的parent_task_address列),就可以得到问题SQL的详细信息了。

在本例中我们先去找由于latch timeout生成的系统转储文件,然后再用windbg进行分析即可。由于SQL Server只会在第一次报出latch timeout时生成转储文件,我们可以设置838trace来使每次报错都生成dump,以便获取更准确和完整的信息。

dbcc traceon(838,-1)

 

转载于:https://www.cnblogs.com/leohahah/p/7473870.html

你可能感兴趣的文章
Mysql 模糊匹配(字符串str中是否包含子字符串substr)
查看>>
python:open/文件操作
查看>>
流程控制 Day06
查看>>
Linux下安装Tomcat
查看>>
windows live writer 2012 0x80070643
查看>>
tomcat 和MySQL的安装
查看>>
git常用操作
查看>>
京东SSO单点登陆实现分析
查看>>
u-boot启动第一阶段
查看>>
MySQL批量SQL插入性能优化
查看>>
定义列属性:null,default,PK,auto_increment
查看>>
用户画像展示
查看>>
C#中StreamReader读取中文出现乱码
查看>>
使用BufferedReader的时候出现的问题
查看>>
批处理文件中的路径问题
查看>>
hibernate出现No row with the given identifier exists问题
查看>>
为什么wait()和notify()属于Object类
查看>>
配置NRPE的通讯
查看>>
匹配两个空格之间的字符。。。
查看>>
CSS 文字溢出 变成省略号 ...
查看>>