我正在尝试在我维护的Web应用程序中调试SQL超时的来源.我有C#代码的源代码,所以我确切地知道正在运行什么代码.我已经将应用程序调试到执行超时的SQL代码的行,并且我在SQL分析器中观察运行的查询.
当此查询从Web执行时,它会在30秒后超时.但是,当我完全按照Profiler中显示的方式剪切/粘贴查询时,我将其放入SSMS并运行它,它几乎立即返回.我已经跟踪了ARITHABORT在Web正在使用的连接中设置为OFF的问题(也就是说,如果我在SSMS会话中关闭ARITHABORT,它会运行很长时间,如果我将其重新打开,那么它会运行很快).但是,阅读ARITHABORT的描述,它似乎并不适用......我只做一个简单的SELECT,并且根本没有执行任何算法......只有一个带有WHERE条件的INNER JOIN:
为什么ARITHABORT OFF会在此上下文中导致此行为?有什么办法可以改变SSMS对该连接的ARITHABORT设置吗?我正在使用SQL Server 2008.
sql-server ssms sql-server-2008 query-performance arithabort
我有一个带签名的T-SQL存储过程
CREATE PROCEDURE MyProc
@recordCount INT OUTPUT
@param1 INT
...
Run Code Online (Sandbox Code Playgroud)
在Sql Server中直接执行时,该过程在5秒内运行,返回一些总计约100行的结果集.
调用使用ADO.NET此过程SqlDataAdapter.Fill方法来填充Dataset导致SqlTimeoutException在SqlCommand3分钟后(指定的超时间隔).
更改存储过程以使其不再具有输出参数,并且所需的输出值作为最后的结果集返回,解决了问题,并且整个过程在预期的5秒内运行.
但为什么?
我不想通过我的代码库来修改这种行为的所有实例,而不理解我是否真的解决了这个问题.
另一件需要注意的是,这只在一个特定的服务器上显而易见,它确实拥有比我们运行的其他类似数据库更大的数据集.肯定不是Sql Server设置?
UPDATE
进入框架源,问题似乎出现在元数据检索中.对象的ConsumeMetaData方法SqlDataReader无限期挂起.但是我在其他数据库上运行测试并且无法重现,因此当通过ADO.NET调用此过程时,这是一个特定于数据库的问题...很棒.
更新II
已确认如果我将代码更改为使用OleDbDataAdapterSQLOLEDB或SQLNCLI提供程序类型,则问题仍然存在.绝对与连接有关.
我正在从实体框架调用一个表值函数,并且需要能够添加option (recompile)它,因为它拾取的执行计划不是最佳的.在SQL Server Management Studio中运行查询,它看起来像这样:
select
*
from dbo.fDE_myquery(0, 0, 3309, '7/1/2013', '7/1/2014', 0, 0)
option (recompile)
Run Code Online (Sandbox Code Playgroud)
来自EF,没有办法添加这个提示,AFAIK.EF部分看起来像:
var query = from f in ctx.fDE_myQuery(aBool, anotherBool, StartDate,
EndDate, someInt, moreBool)
select f;
Run Code Online (Sandbox Code Playgroud)
我看到了这个问题:
但它已经过时了,所接受的解决方案并没有提供足够的信息来说明如何使用实体框架实际实施建议的解决方案(使用计划指南).如果这是唯一的解决方案,那么如何让实体框架使用计划指南呢?
我已经有这个问题了几个星期了.问题是查询需要4-5分钟才能在网站上运行,最多需要2或3秒才能在ssms中运行.此外,我发现在对此查询进行更改后,例如添加customerId变量,它将在网页上快速开始运行,但到第二天它再次变慢.有问题的查询是这样的:
DECLARE @customerID INT
SET @customerID = @CustID
DECLARE @MyTable table(
Iden int NOT NULL IDENTITY(1,1),
ProductID int)
INSERT INTO @MyTable(ProductID)
SELECT P.ProductID FROM Product P WITH (NOLOCK)
left join Compunix_ProductMMY cpmmy with (nolock) on p.ProductID = cpmmy.ProductID
left join Compunix_CustomerMMY ccmmy with (nolock) on ccmmy.mmyid = cpmmy.mmyid
WHERE P.Deleted=0 AND P.Published=1 and (ccmmy.customerid = @customerID OR cpmmy.productid IS NULL)
SELECT c.Name, c.SeName, c.CategoryID
FROM Category c WITH (NOLOCK)
JOIN ProductCategory PC With (NOLOCK) ON C.CategoryID = PC.CategoryID
JOIN @MyTable …Run Code Online (Sandbox Code Playgroud) 我有一个相当简单的查询,我不断获得超时(它需要超过三分钟完成,我提前停止,所以我可以发布这个问题)在代码运行时,但是当我从同一台计算机运行相同的查询时在Sql Server Management Studio中,只有2532 ms在服务器上没有缓存数据和524 ms重复查询时,查询才会进行第一次查询.
这是我的c#代码
using (var conn = new SqlConnection("Data Source=backend.example.com;Connect Timeout=5;Initial Catalog=Logs;Persist Security Info=True;User ID=backendAPI;Password=Redacted"))
using (var ada = new SqlDataAdapter(String.Format(@"
SELECT [PK_JOB],[CLIENT_ID],[STATUS],[LOG_NAME],dt
FROM [ES_HISTORY]
inner join [es_history_dt] on [PK_JOB] = [es_historyid]
Where client_id = @clientID and dt > @dt and (job_type > 4 {0}) {1}
Order by dt desc"
, where.ToString(), (cbShowOnlyFailed.Checked ? "and Status = 1" : "")), conn))
{
ada.SelectCommand.Parameters.AddWithValue("@clientID", ClientID);
ada.SelectCommand.Parameters.AddWithValue("@dt", dtpFilter.Value);
//ada.SelectCommand.CommandTimeout = 60;
conn.Open();
Logs.Clear();
ada.Fill(Logs); …Run Code Online (Sandbox Code Playgroud) 我有一个存储过程,在我自己运行它几毫秒后完成执行.但是,一旦我将存储过程导入EF并使用相同的确切参数调用它,则需要5分钟才能完成.我需要调整某种设置或导致这种缓慢的原因吗?
asp.net stored-procedures entity-framework poco entity-framework-4
使用SQL Server 2005,在几个大表上有一个SQL查询,它在程序中超时.但是,当我在查询分析器中运行它时,它在大约30秒内完成.
为什么不同?