关于timeout之sqlserver篇

写在开头

  • 与SQLServer相关的timeout,都是由Client端发起的,SQLServer没有针对服务器端的全局查询超时参数

    比如说,我们写了个C#小程序,其中使用了SqlCommand.CommandTimeout属性,指定它的值为20秒。那么,当这个query在SQL端执行了20秒后,C#小程序会给SQL Server发送一个TDS Tension数据包,告诉SQL Server我这边超时了,你那边的query不用做了。于是SQL响应client的请求,断掉connection。Client端报出一条exception,说SQL Server端的运行时间太长,超过了我们原定的时限。

  • 服务器端针对timeout的参数,请参考:

SELECT name,value_in_use,description FROM sys.configurations WHERE name like '%timeout%' OR name like '%query%wait%'

--.返回
name                        value_in_use    description
remote login timeout (s)    10                remote login timeout
remote query timeout (s)    600                remote query timeout
query wait (s)                -1                maximum time to wait for query memory (s)
PH timeout (s)                60              DB connection timeout for full-text protocol handler (s)

[TOC]

服务端配置

1 服务端配置查询超时

1.1 配置 Remote query timeout

(右键实例) >> Server Properties >> Connections >> Remote query timeout
  • 该选项指定在 SQL Server 超时之前远程操作可以持续的时间(秒)
  • 此值将应用到由作为远程查询的 数据库引擎 发起的发送连接,此值不会对 数据库引擎接收的查询产生任何影响
  • 该选项对链接服务器有效,指定SQL Server超时之前远程操作可以持续的秒数(默认600s);
  • 对于远程存储过程,remote query timeout 指定在发送一个远程 EXEC 语句之后,在远程存储过程超时前必须等待的秒数;
  • 假如在sql02上设置为300s(默认600s),若sql01远程(比如LinkedServer)访问sql02超过此值则报超时;
--.配置
USE master 
exec sp_configure 'remote query timeout (s)', 300
RECONFIGURE WITH OVERRIDE

--.确认
SELECT name,value_in_use FROM sys.configurations WHERE name like '%query%out%'

1.2 配置链接服务器 query timeout

(右键链接服务器) >> 属性 >> 服务器选项 >> query timeout
  • 对于某链接服务器设置的 query timeout 优先级高于全局设置的 remote query timeout (s)

2 服务端配置连接登录超时

2.1 配置 remote login timeout

(右键实例) >> Server Properties >> Advanced >> remote login timeout
  • 远程登录超时,对链接服务器有效,客户端连接服务器最长等待的秒数(默认10秒,0表示无限期等待)。
  • 如果您尝试登录到一个远程服务器而该服务器已关闭,remote login timeout 帮助确保您在计算机停止登录尝试前不必无限期地等待下去。
--.配置
USE master 
exec sp_configure 'remote login timeout (s)', 10
RECONFIGURE WITH OVERRIDE

--.确认
SELECT name,value_in_use FROM sys.configurations WHERE name like '%login%out%'

2.2 配置链接服务器 connection timeout

(右键链接服务器) >> 属性 >> 服务器选项 >> connection timeout
  • 对于某链接服务器设置的 connection timeout 优先级高于全局设置的 remote login timeout (s)

3 服务端配置查询等待值

3.1 配置 query wait

(右键实例) >> Server Properties >> Advanced >> query wait
  • 这个是针对客户端的设置,不考虑是否链接服务器。
  • 查询等待内存资源时间,默认值为-1,意味着超时值计算为估计的查询开销的 25 倍。如果某个查询估计执行 2 秒,那查询执行 50 秒也不会报错。这个参数涉及内存的分配,暂无测试方法
--.配置
USE master 
exec sp_configure 'query wait (s)', 10
RECONFIGURE WITH OVERRIDE

--.确认
SELECT name,value_in_use FROM sys.configurations WHERE name like '%query%wait%'

4 服务端配置锁超时

4.1 配置 SET LOCK TIMEOUT

Tools >> Options >> Query Execution >> SQL Server >> Advanced >> SET LOCK TIMEOUT
Query >> Query Options >> Execution >> Advanced >> Execution SET LOCK TIMEOUT
  • 针对当前session设置锁超时时间(毫秒,默认-1无限制等待),如果没有lock,比如with(nolock),则不会超时;
  • Tools 中的 SET LOCK_TIMEOUT 为全局设置,对当前、也仅限SSMS所在的整个服务器多个实例有效,仅对新的连接生效;
  • Query 中的设置仅对当前打开的查询窗口有效,立即生效;
SET LOCK_TIMEOUT 300
SELECT @@LOCK_TIMEOUT
WAITFOR DELAY '00:00:10'                                         --.没有lock无法验证
SELECT TOP 100000 * FROM ip2location..ip2location WITH(UPDLOCK)  --.先后起2个此操作可验证

5 服务端配置执行超时

5.1 配置 Execution Time-Out

Query >> Query Options >> Execution >> General >> Execution Time-Out
Tools >> Options >> Query Execution >> Execution Time-Out
  • 执行语句前的最长等待时间,这个类似C#种的SqlCommand.CommandTimeout对象属性的超时
  • Tools 中的 Execution Time-Out 为全局设置,对当前SSMS所在的整个服务器多个实例有效,设置在新的连接中生效。
  • Query 中的设置仅对当前打开的查询窗口有效,立即生效;

6 服务端配置设计器超时

6.1 SSMS修改表设计的Timeout

Tools >> Options >> Designers >> 覆盖表设计器更新的链接字符串超时值

此选项主要针对SSMS修改表字段类型的时候,设置的超时时间。

[最佳实践] 数据库字符串-for开发

  • [针对连接字符串] 之 Connect Timeout 选项
connectStr = "Data Source=127.0.0.1,1433;Initial Catalog=db01;uid=sa;pwd=***;Max Pool Size=150;Connect Timeout=180;"
  • [针对Web.config] 设置http请求 executionTimeout 选项
<system.web>  
<httpRuntime maxRequestLength="102400" executionTimeout="180" />
</system.web>
  • [针对C#] 之 SqlCommand.CommandTimeout 对象属性的超时,针对查询
SqlCommand cmd = new SqlCommand();
cmd.CommandTimeout = 180;

强烈推荐设置 LOCK_TIMEOUT

  • 指定语句等待锁释放的毫秒数,即在 SQL Server 返回锁定错误前经过的毫秒数。

    值为 -1(默认值)时表示没有超时期限(即无限期等待)。
    值为 n,则表示当锁等待超过超时n秒将返回错误。
    值为 0 时表示根本不等待,一遇到锁就返回消息。

  • 在连接开始时,此设置的值为 -1。 设置更改后,新设置在其余的连接时间里一直有效。
--.设置
SET LOCK_TIMEOUT 15
Copyright © www.sqlfans.cn 2023 All Right Reserved更新时间: 2022-01-14 17:30:09

results matching ""

    No results matching ""