SQL Server 调查超时错误

Posted

技术标签:

【中文标题】SQL Server 调查超时错误【英文标题】:SQL Server investigating time out error 【发布时间】:2017-10-19 09:49:30 【问题描述】:

我的任务是调查现有 ETL 的超时错误。我想访问以前 ETL 运行的日志以确定超时发生的位置。 ETL 位于 Azure 上,一项任务不断失败。

不断失败的任务有效地启动了 SQL Server 上的存储过程。我想知道是否可以使用一些日志和统计数据来进行调查。我知道存储过程中使用的表,所以这有望给我一个起点。但基本上我是在以下信息之后。

    超时发生在哪个表

    是什么导致超时,即是死锁

    还有哪些其他进程(即存储过程)使用受影响的表。

我可以在 SQL Server 中使用哪些功能进行挖掘。任何帮助,将不胜感激。

【问题讨论】:

【参考方案1】:

不断失败的任务,有效地启动了 SQL Server 上的存储过程

我建议微调此过程并尝试更新此过程中涉及的表的统计信息。这应该可以解决大多数超时问题..

超时发生在哪个表

azure log analytics 中应该有错误记录

是什么导致超时,即它是死锁

超时不是死锁

大多数超时的原因都与执行不良的过程/查询有关。在我们的例子中,我们可以通过调整所涉及的查询并更改超时设置来克服超时

【讨论】:

【参考方案2】:

写轮眼,

存储过程中的步骤不会导致超时。调用 SP 的客户端有一个超时值,如果 SP 花费的时间超过这个值,它就会“认为”有问题。这并不意味着您的 SP 架构错误,或者它实际上失败了。

一种方法是创建一个日志记录表,然后在您的存储过程中,在开始时从该表中删除所有行(它是一个 TEMP 表,每次运行 SP 时都会被清除)。然后在该过程的每个步骤之前,在您的日志记录表中插入一行,其中包含“正在启动员工 ETL...”,并在“已完成员工 ETL...”步骤之后。

您还可以在每个步骤之后检查是否发生错误,并将错误消息写入此表。这实际上变成了您自己的日志。

IF @@ERROR <> 0
BEGIN
   -- Add Error_Message to your table
END

如果调用进程没有正确设置超时值,您可能会看到 SP 实际完成(通过检查您的日志),但客户端错误地认为有问题,因为已超过超时值。客户端的超时错误不会阻止 SQL Server 继续工作。

您能否尝试从 SSMS 自行运行存储过程?如果这可行,您就可以追踪问题,但重要的是要区分它是 SQL,还是您的客户端(如 Azure 逻辑应用程序),或者启动 ETL 过程的任何东西。您可能需要制造/模拟传递给 SP 的任何参数,但这在 SSMS 中应该很容易。

您还可以将一个大 SP 分解为一堆较小的 SP,并向您的 ETL 客户端添加更多步骤,而不是一个巨大的 SP 调用。这可能会迫使您实施瞬态错误处理,但这在您的情况下可能是可控的。

祝你好运!

【讨论】:

以上是关于SQL Server 调查超时错误的主要内容,如果未能解决你的问题,请参考以下文章

sql 在调查性能时清理SQL Server缓存。

SQL Server AlwaysOn中445端口使用的调查报告

我应该从哪里开始调查 SocketTimeoutException:读取超时

如何调查 SQLAlchemy QueuePool 限制溢出?

如何为 Spring WebFlux 配置 netty 连接超时

SQL Server 使用窗口函数计算 AVG()