HI 我们的asp.net应用程序正在超时。我们使用sql server 2005作为数据库。 查询分析器中的查询运行速度非常快。但是,当我们通过分析器检查时间时,它显示的时间比我们在查询分析器中获得的时间多很多倍。 (参与是不是原因) 非常感谢任何帮助
感谢
我们在SAN上 清理了柜台。新的计数器是
ASYNC_NETWORK_IO 540 9812 375 78
WRITELOG 70 1828 328 0
超时仅发生在特定SP的特定SP上。如果我们更改params并访问应用程序它工作正常。我们运行了探查器,发现在asp.net端发生超时后,SP batchcompleted语句出现在探查器中。如果我们重启服务器一切正常
如果我们从缓存中删除该计划,该应用程序工作正常。但是我们已经考虑了sp中的参数嗅探。还有什么可能是原因
答案 0 :(得分:1)
如果我要猜测,我会假设来自网络服务器的后台数据库负载正在提升锁定并导致整个事情变慢。然后你采取一个大型查询并运行它,这会导致锁定(和资源)争用。
我看到这个所有时间与公司抱怨从一个SQL服务器到群集时客户端 - 服务器应用程序的性能问题。在网络世界中,我们会更早地解决这些问题。
解决问题(大多数时候)以解决以下问题之一: *重构您的查询以更好地工作(例如,存储SCOPE_IDENTITY而不是调用它5次) *在任何有意义的地方使用NO LOCK statement。
编辑:
此外,尝试使用新的2008 SQL Management Studio 'Activity Monitor'查看服务器。您可以通过右键单击服务器并选择“活动监视器”来找到它。
编辑#2:
它慢多少?你的SAN似乎占用了大约10秒的时间,但是如果你说的是20秒而不是360秒,那就不会相关了,并且没有等待锁,所以我想我画的是空白。如果差异在1秒到10秒之间,那么它似乎与网络有关。
答案 1 :(得分:1)
运行以下脚本以创建此存储过程:
CREATE PROC [dbo].[dba_SearchCachedPlans]
@StringToSearchFor VARCHAR(255)
AS
/*----------------------------------------------------------------------
Purpose: Inspects cached plans for a given string.
------------------------------------------------------------------------
Parameters: @StringToSearchFor - string to search for e.g. '%<MissingIndexes>%'.
Revision History:
03/06/2008 Ian_Stirk@yahoo.com Initial version
Example Usage:
1. exec dba_SearchCachedPlans '%<MissingIndexes>%'
2. exec dba_SearchCachedPlans '%<ColumnsWithNoStatistics>%'
3. exec dba_SearchCachedPlans '%<TableScan%'
4. exec dba_SearchCachedPlans '%CREATE PROC%MessageWrite%'
-----------------------------------------------------------------------*/
BEGIN
-- Do not lock anything, and do not get held up by any locks.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT TOP 100
st.TEXT AS [SQL],
cp.cacheobjtype,
cp.objtype,
DB_NAME(st.dbid) AS [DatabaseName],
cp.usecounts AS [Plan usage],
qp.query_plan
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) qp
WHERE CAST(qp.query_plan AS NVARCHAR(MAX)) LIKE @StringToSearchFor
ORDER BY cp.usecounts DESC
END
然后执行:
exec dba_SearchCachedPlans '%<MissingIndexes>%'
看看你是否缺少任何推荐的索引。
当SQL Server创建计划时,它会将其与任何建议的索引一起保存。只需单击query_plan列文本即可显示图形。在顶部会有你应该实现的推荐索引。
答案 2 :(得分:0)
我没有你的答案,因为我不是一个上师。但我确实记得最近在一些SQL博客上阅读SQL 2008还有一些额外的东西可以添加到查询/存储过程中,因此它会以不同的方式计算。我认为你可以尝试搜索的一件事叫做“提示”。此外,SQL如何使用当前的“统计信息”也有所不同。看那个。以及如何仅为第一次运行生成执行计划 - 如果该计划不适用于不同的参数值,因为搜索/返回的内容会有很大差异,我认为这可能会出现这种情况。
抱歉,我的帮助不大。我只是在这个级别上了解SQL Server性能。我敢打赌,如果你问Brent Ozar之类的人,他可以指出你正确的方向。
答案 3 :(得分:0)
之前我曾经有过几次相同的问题。当某个特定用户在部署时在网站上时似乎发生了这种情况。当该用户使用其ID运行某些存储过程时,它将超时。当其他人运行它,或者我会从数据库运行它时,它会立即运行。我们让DBA看了他们所能做的一切,他们从未得到过答案。最后,每当我重新部署网站并且用户尚未登录时,一切都已修复。
答案 4 :(得分:0)
我遇到了类似的问题,而我的情况则与SP重新编译有关。具体来说,这是我使用临时表和表变量。
答案 5 :(得分:0)
请查看以下文章中的讨论部分:http://www.sqlservercentral.com/articles/Performance/63638/
由于 伊恩