sql在ssms中运行快在asp.net中运行慢
我已经有这个问题好几个星期了。问题是,查询在网站上运行需要4-5分钟,在ssms中运行最多需要2-3秒。我还发现,在我对这个查询进行更改(比如添加customerId变量)之后,它将在网页上快速运行,但第二天它又变慢了。有问题的问题是:sql在ssms中运行快在asp.net中运行慢,sql,asp.net,.net,sql-server-2008,ssms,Sql,Asp.net,.net,Sql Server 2008,Ssms,我已经有这个问题好几个星期了。问题是,查询在网站上运行需要4-5分钟,在ssms中运行最多需要2-3秒。我还发现,在我对这个查询进行更改(比如添加customerId变量)之后,它将在网页上快速运行,但第二天它又变慢了。有问题的问题是: DECLARE @customerID INT SET @customerID = @CustID DECLARE @MyTable table( Iden int NOT NULL IDENTITY(1,1), ProductID int) INSERT I
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 MT ON PC.ProductID=MT.ProductID
WHERE C.Published = 1
GROUP BY c.Name, c.SeName, c.CategoryID
ORDER BY c.Name
我在另外两个网站上运行了相同的查询,效果很好。两个站点之间的唯一区别在于,它们运行在不同的数据库上,速度较慢的站点上的产品(54000个产品)比其他两个站点上的产品(54000个产品)多一点。这三个站点及其数据库都托管在同一台计算机上。您很可能遇到了参数嗅探问题
我建议阅读Erland Sommarskog的文章,以全面了解这个问题(文章很长,但非常好)。看看ASP.Net应用程序和SSMS会话的sys.dm_exec_会话。我猜您的
设置中至少有一个设置不同。这可能导致不同的计划(最终归因于参数嗅探),而应用程序端的情况通常会更糟
有关更多详细信息,请参见以下其他问题:
不管它值多少钱,我们偶尔会遇到同样的问题;可能一年一次。你可以花一周时间阅读和消化其他答案中提到的所有精彩资源,或者你可以做我们所做的事情;停止并启动SQL Server
这是一种享受
我们已经注意到,这个问题通常发生在各种schema/sp/view mod之后,这些mod可能与手头的问题没有直接关系。我也有同样的问题,在我的案例中,它与MARS有关,因此我删除了MultipleActiveResultSets=True和现在的运行时间B几乎相同(0.2秒,之前为4.5秒)
注意:MARS=多个活动结果集。如果在连接字符串上设置此属性,则可以以交错方式在同一连接上运行多个查询。它主要允许您在迭代结果集时提交更新语句
您是否正在使用任何orm
?如果您使用的是nhibernate
,则可以在nhibernate
中启用db跟踪,并查看可能出现的问题。以下是我在这些场景中观察到的一些场景:
隐式转换导致错误的计划选择(nvarchar
被使用,而不是varchar
)。您可以在其日志中观察nhibernate参数映射
缺少索引
Nhibernate
使用log4net
,您只需添加一个附录,如下所述:
同时执行以下步骤对我很有效
尝试重新编译存储过程
清除计划缓存
更新数据库上的统计信息
表变量和临时表在查询执行中起着很大的作用
我不知道你为什么要使用table变量,你可以试试这段代码,看看这是否解决了你的慢度之谜
DECLARE @customerID INT
SET @customerID = @CustID
SELECT c.Name, c.SeName, c.CategoryID
FROM Category c WITH (NOLOCK)
JOIN ProductCategory PC With (NOLOCK) ON C.CategoryID = PC.CategoryID
JOIN (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)
) MT ON PC.ProductID=MT.ProductID
WHERE C.Published = 1
GROUP BY c.Name, c.SeName, c.CategoryID
ORDER BY c.Name
你应该标出答案。很可能您有参数嗅探问题什么是设置设置?@crh225 ThingsSET ARITHABORT
,SET QUOTED\u IDENTIFIER
,等等。这是我问题的解决方案,我没有输入参数,但SSM和我的应用程序之间的查询执行时间不同。执行时间从约7000ms增加到1000ms。谢谢如果您遇到与此问题相反的问题(在EF Core 5中的快速转换和SSMS中的慢速转换中),请参阅此链接文档中的第3.1节,并尝试创建一个临时存储过程来运行SQL。