我已经开发了许多.NET / SQL Server应用程序,但是我遭受了SQL查询超时的困扰,无法逾越。我在查找有问题的查询并重新索引/重新编写它们方面有丰富的经验。我的Web应用程序使用SQL Server的RDS和Web应用程序的EC2托管在AWS上。我们每天有100-200个唯一身份用户,数据库大约为15GB,其中有两个表大于1GB。
我整天都看到以下异常消息:
'Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the server is not responding.'
Run Code Online (Sandbox Code Playgroud)
遭受超时的查询与发生超时的时间一样随机。它似乎与任何显而易见的事情都不相符(备份运行一整夜等)。
我尝试从C#应用程序获取每个查询,然后直接在SQL中运行(使用与Arith Abort相同的SET选项),它们都运行良好。有些查询本质上是较慢的查询,但是最慢的查询在大约2秒钟内运行,并且具有约400k逻辑读取。但是,我还看到查询超时在15毫秒内运行,并且具有<10个逻辑读取。
我看到的最奇怪的事情是,我从Web应用程序中获取了一个查询,并将其编码到已运行24小时的控制台应用程序中,每秒调用一次查询。它没有一个异常/超时,即使我已经看到主系统在运行期间针对同一查询也存在超时。
我最近将RDS服务器升级到了M5 Large,并且每天都在一夜之间重建所有索引。我已经运行DBCC FREEPROCCACHE,以确保没有导致问题的过时查询计划。
我觉得这是参数嗅探,或者我最后的想法是硬件/网络故障,但这确实使人难忘!
我得到的堆栈跟踪看起来像是中间查询,而不是在连接阶段。
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
at System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()
at System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()
at System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer()
at System.Data.SqlClient.TdsParserStateObject.TryReadByteArray(Byte[] buff, Int32 offset, Int32 len, Int32& totalRead)
at System.Data.SqlClient.TdsParserStateObject.TryReadString(Int32 length, String& value)
at System.Data.SqlClient.TdsParser.TryReadSqlStringValue(SqlBuffer value, Byte type, Int32 length, …Run Code Online (Sandbox Code Playgroud) 我有15个查询,可以动态生成页面上的表数据以用于报告.每个查询需要250到900毫秒,这意味着页面加载时间为4到13秒,具体取决于服务器负载.加载时间导致一些用户认为页面根本不会加载.
我想知道是否有某种方法可以简化查询以提供更可接受的加载时间.以下是其中一个查询:
<cfquery datasource="MeetingDB" name="One">
SELECT COUNT( meetingID ) AS countatron
FROM case_meeting
WHERE meetingID
IN (
SELECT DISTINCT a.meetingID
FROM case_meeting a
INNER JOIN meeting b ON a.meetingID = b.meetingID
WHERE b.categoryID = '1'
AND SUBSTRING( meetingCode, 5, 2 )
BETWEEN 12
AND 22
AND SUBSTRING( meetingCode, 7, 2 )
BETWEEN 01
AND 12
AND SUBSTRING( meetingCode, 9, 2 )
BETWEEN 01
AND 31
)
AND caseID
IN (
'1', '2', '3', '28', '29', '30', '39', '40', '45'
) …Run Code Online (Sandbox Code Playgroud) public void setQueryTimeout(int queryTimeout)我想知道我们需要传入的值的类型是什么jdbcTemplate。文件说
> Set the query timeout for statements that this JdbcTemplate executes.
> <p>Default is -1, indicating to use the JDBC driver's default (i.e. to
> not pass a specific query timeout setting on the driver). <p>Note: Any
> timeout specified here will be overridden by the remaining transaction
> timeout when executing within a transaction that has a timeout
> specified at the transaction level. @see
> java.sql.Statement#setQueryTimeout
Run Code Online (Sandbox Code Playgroud)
想知道queryTimeout是否是milliseconds, …
我遇到运行缓慢的查询问题,有时执行时间超过30秒,因此我希望增加sqlsrv_query超时.
Fatal error: Maximum execution time of 30 seconds exceeded
Run Code Online (Sandbox Code Playgroud)
我的PHP语法有问题,例如:http://php.net/manual/en/function.sqlsrv-query.php对我来说没有意义.
目前我的连接/设置如下:
$testServer = 'IP\servername,PORT';
$testDetails = array('Database' => 'DBNAME', 'UID' => 'USERNAME', 'PWD' => 'Password');
$testConnect = sqlsrv_connect($testServer, $testDetails);
Run Code Online (Sandbox Code Playgroud)
我的理解是我需要通过作为参数传递timout细节,sqlsrv_connect但我没有得到正确的语法.
(我已经尽可能地优化了查询,不幸的是,考虑到db表的设计,我无法在不到30秒的时间内始终如一地返回.)
sql-server ×2
c# ×1
coldfusion ×1
java ×1
java-8 ×1
jdbc ×1
jdbctemplate ×1
mysql ×1
php ×1
sqlsrv ×1