SQL Server 客户端超时相关参数

18 篇文章 0 订阅

原文内容有较多重复,本文有部分删改和重新整理,原文参考 https://blog.csdn.net/kk185800961/article/details/52969608 

 

一、 客户端连接服务器最长等待时间(for linked server)

  • exec sp_configure 'remote login timeout',10
  • (右键实例) >> Server Properties >> Advanced >> remote login timeout
  • (右键链接服务器) >> 属性 >> 服务器选项 >> connection timeout
  • 链接服务器设置的 connection timeout 可以覆盖全局设置的 remote login timeout
  • 单位为秒

测试前,配置链接服务器,实例 A 创建链接服务器连接到实例B,手动停止 B 服务器中的数据库服务。

在 A 服务器实例执行链接服务器的查询,15秒等待后报错。

OLE DB provider "SQLNCLI10" for linked server "WIN-AHAU9NO5R6U,14333" returned message "Login timeout expired".
OLE DB provider "SQLNCLI10" for linked server "WIN-AHAU9NO5R6U,14333" returned message "A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online.".
Msg 10061, Level 16, State 1, Line 0
TCP Provider: 由于目标计算机积极拒绝,无法连接。

 

二、 客户端执行语句前最长等待时间(for linked server)

  • exec sp_configure 'remote query timeout',10 
  • (右键实例) >> Server Properties >> connections >> remote query timeout
  • (右键链接服务器) >> 属性 >> 服务器选项 >> query timeout
  • 链接服务器设置的 query timeout 可以覆盖全局设置的 remote query timeout
  • 单位为秒

先把刚才的实例B启动,并恢复实例 A 的初始配置,然后设置实例A为7秒超时。

exec sp_configure 'remote query timeout (s)',7
reconfigure with override

在实例B创建一个存储过程,模拟因为某些问题,导致该查询6秒后才开始执行。

CREATE proc [dbo].[test]
as
waitfor delay '00:00:06'
select * from master.sys.objects
GO

此时A  使用链接服务器调用 B 的存储过程,正常执行出结果。即使存储过程中的语句执行10秒也不报错,因为查询在第6秒就执行了,不管执行多久。

EXEC [WIN-AHAU9NO5R6U,14333].DemoDB.DBO.[test]

现在A 设置全局远程连接执行等待超时值为 5 秒,小于上面设置的 6 秒,再执行存储过程。

exec sp_configure 'remote query timeout (s)',5
reconfigure with override
go

OLE DB provider "SQLNCLI10" for linked server "WIN-AHAU9NO5R6U,14333" returned message "Query timeout expired".

发现5秒之后就停止并报错了!B中的存储过程,里面的语句需要第6秒后才能执行,而客户端设置只等待5秒,超出客户端等待范围,停止等待。

 

三、 查询等待内存资源时间

  • EXEC sp_configure 'query wait', 5;
  • (右键实例) >> Server Properties >> Advanced >> query wait
  • 单位为秒

这些参数是对客户端的设置,无关是否使用链接服务器。该参数设置的是查询等待内存资源时间,默认值为-1,意味着超时值计算为估计的查询开销的 25 倍。如果某个查询估计执行 2 秒,那查询执行 50 秒也不会报错。这个参数涉及内存的分配,暂时还没想到测试方法。


四、 锁获取最长等待时间

  • SET LOCK_TIMEOUT 30000;(只在当前打开的查询窗口中生效,立即生效)
  • Query >> Query Options >> Execution >> Advanced >> Execution SET LOCK TIMEOUT(只在当前打开的查询窗口中生效,立即生效)
  • Tools >> Options >> Query Execution >> SQL Server >> Advanced >> SET LOCK TIMEOUT(对客户端所有新建连接生效,包括客户端连到不同SqlServer实例也生效)
  • 单位为毫秒

打开一个查询窗口,执行一个事务,并且设置事务等待一段时间后再提交。只要它能及时获取到锁,执行多久不是该参数操心的事。

--查询窗口(1),事务执行1分钟
BEGIN TRAN
UPDATE DBO.DEMOTAB01 SET INSDATE=GETDATE() WHERE ID=1
WAITFOR DELAY '00:01:00'
COMMIT TRAN
GO

前面说过,超时是客户端的设置,现再打开一个查询窗口,并且设置该客户端锁获取最长等待时间为 5 秒。

SET LOCK_TIMEOUT 5000;

窗口(2)再执行相同语句,因 5 秒钟未能获取到锁,5 秒后窗口(2)报错

--查询窗口(2)
BEGIN TRAN
UPDATE DBO.DEMOTAB01 SET INSDATE=GETDATE() WHERE ID=1
WAITFOR DELAY '00:01:00'
COMMIT TRAN
GO

Msg 1222, Level 16, State 51, Line 1
Lock request time out period exceeded.

 

五、 执行语句前的最长等待时间

  • Query >> Query Options >> Execution >> General >> Execution Time-Out(只在当前打开的查询窗口中生效,立即生效)
  • Tools >> Options >> Query Execution >> SQL Server >> General >> Execution Time-Out(对客户端所有新建连接生效,包括客户端连到不同SqlServer实例也生效)
  • 单位为秒

测试前,把之前的设置都改回为默认值,然后设置 Execution Time-Out = 5。

--该查询正常
BEGIN TRAN
WAITFOR DELAY '00:00:04'
SELECT *  FROM dbo.DemoTab01
COMMIT TRAN
GO

--该查询(5秒后)错误
BEGIN TRAN
WAITFOR DELAY '00:00:05'
SELECT *  FROM dbo.DemoTab01
COMMIT TRAN
GO

结果第一个查询正常(查询前只等待4秒),第二个查询到时停止操作(查询前等待5秒)。一旦查询开始,查询执行多久及不关该参数的事了。比如设置 Execution Time-Out = 5,查询立刻开始,慢查询要执行200秒,是可以执行成功的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值