我在SQL视图上有RO访问权限。以下查询超时。怎么避免这个?
select
count(distinct Status)
from
[MyTable] with (NOLOCK)
where
MemberType=6
我得到的错误信息是:
Msg 121,Level 20,State 0,Line 0
从服务器接收结果时发生传输级别错误(提供程序:TCP提供程序,错误:0 - 信号量超时期限已过期。)
答案 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服务。