如何避免Sql Query Timeout

时间:2009-05-12 16:30:04

标签: sql sql-server

我在SQL视图上有RO访问权限。以下查询超时。怎么避免这个?

select  
  count(distinct Status)  
from 
  [MyTable]  with (NOLOCK)
where 
  MemberType=6

我得到的错误信息是:

  

Msg 121,Level 20,State 0,Line 0

     

从服务器接收结果时发生传输级别错误(提供程序:TCP提供程序,错误:0 - 信号量超时期限已过期。)

9 个答案:

答案 0 :(得分:23)

您的查询可能没问题。 “信号量超时期限已过期”是网络错误,而不是SQL Server超时。

e.g。见http://support.microsoft.com/kb/325487

您和SQL Server之间显然存在某种网络问题。

编辑:但是,显然查询运行15-20分钟后才发出网络错误。这是一个很长的时间,因此网络错误可能与长执行时间有关。优化底层视图可能有所帮助。

如果您的示例中的[MyTable]是一个视图,您是否可以发布视图定义以便我们可以优化它?

答案 1 :(得分:8)

虽然显然存在某种网络不稳定或某种干扰您的连接的事情(15分钟可能会越过NAT边界或网络中的某些东西正在丢弃会话),我认为你想要这么简单?)查询在任何预期的时间内返回(如1s)。

我会与您的DBA交谈并获取在MemberType,Status上的基础表上创建的索引。如果没有单个基础表或者这些更复杂并且由视图或UDF创建,并且您正在运行SQL Server 2005或更高版本,请让他考虑索引视图(基本上以索引方式实现视图)。 / p>

答案 2 :(得分:3)

请检查Windows系统事件日志中是否有专门针对“事件源:Dhcp”的任何错误。这很可能是与DHCP相关的网络错误。地址租约时间已过期。它不应该是与SQL Server或查询本身相关的问题。

只需在互联网上搜索“信号量超时期限已过期”,您就可以获得大量建议,解决您的问题。不幸的是,这个问题似乎没有 解决方案。

答案 3 :(得分:2)

您可以在MemberType上添加索引。

答案 4 :(得分:1)

您是否在Status列和MemberType列上定义了索引?

答案 5 :(得分:0)

你有多少条记录?桌子上有什么索引吗?试试这个:

;with a as (
select distinct Status
from MyTable
where MemberType=6
)
select count(Status)
from a

答案 6 :(得分:0)

我的团队在长期运行的SSIS软件包中间歇性地遇到这些问题。自Windows服务器修补以来,这种情况一直在发生。

我们的SSIS和SQL服务器位于单独的VM服务器上。

与我们的Wintel Servers团队一起,我们重新启动了两台服务器,目前,问题似乎已经消失了。

工程师说,他们不确定问题是否是他们同时更新的补丁程序或新的VMTools。现在,我们将进行监视,如果超时问题再次出现,他们将尝试回滚VMXNET3驱动程序,然后,如果该方法不起作用,请卸下June Rollup修补程序。

因此,对我们而言,此问题与SQL查询无关(我们正在加载数十亿个新行,因此它必须长期运行)。

答案 7 :(得分:0)

尽管我很想怪我的问题-我的查询遇到了同样的错误,它的错误很多很多,而且涉及很多循环-在网络上,我认为并非如此。< / p>

不幸的是,事情并非如此简单。查询运行了3个多小时后才收到该错误,并且如果它只是SSMS中的查询和SQL Server上的一项工作,显然它会同时崩溃(尚未查看该错误的详细信息,因此不确定是否是同一错误;绝对是同一地点)。

因此,以防万一有人来这里遇到类似问题,该线程: https://www.sqlservercentral.com/Forums/569962/The-semaphore-timeout-period-has-expired

建议它同样可能是硬件问题或实际超时。

就每个循环所需的时间而言,我的循环甚至都不行(它们取决于给定月份的销售水平),因此,一个好月​​份需要大约20分钟来计算(查询查询为4年)。

这样,就完全有可能需要优化查询。我什至会说这很可能,因为我所做的一些更改包括新表,这些新表是堆...因此,在进行虚拟机配置和硬件测试之前,需要进行另一轮索引数据。

请注意,这是一个古老的问题:我使用的是SQL Server 2012 SE,SSMS是2018 Beta,运行SQL Server的VM专有使用132GB的RAM(总计30%),8个内核和2TB的内存。 SSD SAN。

答案 8 :(得分:-1)

发生这种情况是因为另一个sql server实例正在运行。因此,您需要先杀死然后才能登录SQL Server。

为此转到任务管理器并终止或终止SQL Server服务,然后转到Services.msc并启动SQL Server服务。