了解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中文網其他相關文章!