Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql在ssms中运行快在asp.net中运行慢_Sql_Asp.net_.net_Sql Server 2008_Ssms - Fatal编程技术网

sql在ssms中运行快在asp.net中运行慢

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

我已经有这个问题好几个星期了。问题是,查询在网站上运行需要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 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 Things
    SET ARITHABORT
    SET QUOTED\u IDENTIFIER
    ,等等。这是我问题的解决方案,我没有输入参数,但SSM和我的应用程序之间的查询执行时间不同。执行时间从约7000ms增加到1000ms。谢谢如果您遇到与此问题相反的问题(在EF Core 5中的快速转换和SSMS中的慢速转换中),请参阅此链接文档中的第3.1节,并尝试创建一个临时存储过程来运行SQL。