了解 SSMS 和 ASP.NET 之间的 SQL 性能差异
在 SSMS 中执行 SQL 查询时,您会遇到显着的性能差异到 ASP.NET。如下所示的查询在 SSMS 中运行只需几秒钟,但在您的网站上则需要几分钟。
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
罪魁祸首:参数嗅探
The造成这种差异的最可能原因是参数嗅探。参数嗅探是一种性能优化技术,SQL Server 在第一次执行时分析查询参数,并根据这些参数创建执行计划。如果稍后查询参数发生更改,SQL Server 可能不会重新编译执行计划并继续使用原始计划,这对于新参数可能不是最佳的。
在这种情况下,查询性能可能会下降,因为首次使用特定 @CustID 值运行查询时优化的执行计划对于使用不同 @CustID 值的后续运行来说并不理想。
解决问题
为了减轻参数嗅探,您可以在查询中使用 FORCESEEK 提示。这会强制 SQL Server 为每次执行查询创建一个新的执行计划,确保它使用给定参数的最佳计划。
要解决此问题,请按如下方式修改查询:
DECLARE @customerID INT SET @customerID = @CustID DECLARE @MyTable table( Iden int NOT NULL IDENTITY(1,1), ProductID int) WITH (FORCESEEK) 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
以上是为什么我的 SQL 查询在 SSMS 中很快,但在 ASP.NET 中却很慢?的详细内容。更多信息请关注PHP中文网其他相关文章!