Ian*_*oyd 5 sql-server profiler sql-server-2014
我在生产服务器上遇到了奇怪的事情。客户端(都在本地 LAN 上)在查询时出现超时错误,本应完全没有问题。
我花了一个下午在 SQL Server Profiler 中实时观察跟踪,而毫无意义的绝对缩影是批处理:
SELECT GETDATE() As ServerDate
Run Code Online (Sandbox Code Playgroud)
探查器显示数字的地方:
在这个数据库引擎中可能会发生什么,完全良性查询需要太长时间?
因为即使服务器是忙,一个查询,需要:
不应该需要 17 秒才能完成。
唯一的出路是想办法弄清楚这duration 意味着什么。
持续时间是什么意思?是吗:
或者是:
或者是:
(但是 SQL Server 如何知道客户端“接收”了最后一个字节的时间)。
因为鉴于:
这中间一定有什么问题。所以我需要确切地知道 SQL Server 使用什么概念事件来表示start和end。
当然,毫秒与微秒不是我的问题。
鉴于唯一getdate()需要的锁是:
如果问题是由于锁定引起的:
那也不是我的问题。我的问题是同义反复。
我写的问题很简单:
持续时间是什么意思?
当然,这很容易回答:
持续时间是EndTime - StartTime。
这意味着我实际上是在问(而不是迂腐):
如果我能得到答案,我接下来的问题将是找到介于两者之间的所有事件。
查看以下期间所有事件的时间表可能会有所帮助select getdate():
当然,这只是一个不可重复的、随机的、运行时间过长的查询示例。
SQL Server 2005 跟踪的持续时间以微秒(百万分之一秒)为单位存储,而 SQL Server 2000 跟踪的持续时间以毫秒(千分之一秒)为单位存储。CPU 总是以毫秒为单位存储。
长时间没有工作的典型原因是阻塞:其他人锁定了某行。
要了解查询等待的原因,请跳过 Profiler 并前往 Adam Machanic 的 sp_WhoIsActive。它向您显示当前正在运行哪些查询,并且 wait_info 列告诉您它们正在等待什么(以及等待多长时间)。如果你看到 LCK*,那么它就被阻塞了。