首頁 > 資料庫 > mysql教程 > 為什麼我的 SQL 查詢在 SSMS 中很快,但在 ASP.NET 中卻很慢?

為什麼我的 SQL 查詢在 SSMS 中很快,但在 ASP.NET 中卻很慢?

Linda Hamilton
發布: 2024-12-31 21:54:14
原創
953 人瀏覽過

Why is my SQL query fast in SSMS but slow in ASP.NET?

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板