日期:2014-05-16  浏览次数:20629 次

Timeout expired 疑难问题
一个小型电子商务网站, Web端是asp.net 2.0 开发, 语言C#, 链接另外一台MS SQL服务器, SQL Server 2008 R2 Standard版本, 已打补丁SP2, 程序偶尔会出现如下错误,
Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.

日志记录是一些查询SQL语句造成, 查询的表数据量不算大, 表的各种优化都已经做了. 神奇的地方是, 这个语句在这台服务器上会连续比较长的时间出现这个错误, 同样的这个表的其他查询在这台服务器上都正常, 同样配置的其他Web服务器执行也非常正常, 监视了数据库执行, 这条语句没有发现死锁, 并且很快执行完毕了, 但是在Web端会出现这个超时错误, 服务器是Win Server2008 Standard版本, 已经打了提示的所有补丁, 在其他的同样配置服务器上没有出现过类似问题, 实在是搞不清楚原因了.

请不要回答让我加长SQL执行时间, 我感觉不是这个问题造成的, 因为查询的数据很少, 并不是数据库端真的执行超时.

请教各位大侠, 有哪位遇到过类似的问题.
------解决方案--------------------
有没有可能是其他语句阻塞了这条语句的执行。你在你出问题的这个服务器上,使用profiler检测下这条语句的前后有啥语句?然后再测试下。
------解决方案--------------------
既然已经确定SQL很快(说明没有阻塞),那么问题的可能性就在网络上了
但也得留意一下阻塞情况,一切皆有可能

------解决方案--------------------
当然不能简单加长连接时间,据我个人经验,通常是有什么大事务在运行,有些可能是用户请求,有些可能是系统进程,比如我以前在对一个100G的库做完整备份的过程又想连接sqlserver,就会出现你这个报错,如果你确定这段事件没有系统任务在运行,那么最好检查一下你的语句,我这里有个脚本,你执行一下看看:


--运行时间最长的查询
SELECT  SUBSTRING(qt.text, ( qs.statement_start_offset / 2 ) + 1,
                  ( ( CASE qs.statement_end_offset
                        WHEN -1 THEN DATALENGTH(qt.text)
                        ELSE qs.statement_end_offset
                      END - qs.statement_start_offset ) / 2 ) + 1) ,
        qs.execution_count ,
        qs.total_logical_reads ,
        qs.last_logical_reads ,
        qs.total_logical_writes ,
        qs.last_logical_writes ,
        qs.total_worker_time ,
        qs.last_worker_time ,
        qs.total_elapsed_time / 1000000 AS total_elapsed_time_in_S ,
        qs.last_elapsed_time / 1000000 AS last_elapsed_time_in_S ,
        qs.last_execution_time ,
        qp.query_plan
FROM    sys.dm_exec_query_stats qs
        CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
        CROSS APPLY sys.dm_exec_query_plan(qs.sql_handle) qp
ORDER BY qs.total_worker_time DESC --CPU时间