SQL-Leistungsunterschiede zwischen SSMS und ASP.NET verstehen
Sie stellen einen erheblichen Leistungsunterschied fest, wenn Sie eine SQL-Abfrage in SSMS im Vergleich ausführen zu ASP.NET. Die unten gezeigte Abfrage wird in SSMS in Sekundenschnelle ausgeführt, auf Ihrer Website dauert es jedoch Minuten.
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
Der Übeltäter: Parameter-Sniffing
Der Die wahrscheinlichste Ursache für diese Diskrepanz ist Parameter-Sniffing. Parameter-Sniffing ist eine Technik zur Leistungsoptimierung, bei der SQL Server die Abfrageparameter bei der ersten Ausführung analysiert und auf der Grundlage dieser Parameter einen Ausführungsplan erstellt. Wenn sich die Abfrageparameter später ändern, kompiliert SQL Server den Ausführungsplan möglicherweise nicht neu und verwendet weiterhin den ursprünglichen Plan, der für die neuen Parameter möglicherweise nicht optimal ist.
In diesem Fall nimmt die Abfrageleistung wahrscheinlich ab, weil die Der Ausführungsplan, der für die erste Ausführung der Abfrage mit einem bestimmten Wert für @CustID optimiert wurde, ist nicht ideal für nachfolgende Ausführungen mit unterschiedlichen @CustID-Werten.
Auflösen des Problem
Um Parameter-Sniffing einzudämmen, können Sie den FORCESEEK-Hinweis in der Abfrage verwenden. Dadurch wird SQL Server gezwungen, für jede Ausführung der Abfrage einen neuen Ausführungsplan zu erstellen, um sicherzustellen, dass der optimale Plan für die angegebenen Parameter verwendet wird.
Um das Problem zu beheben, ändern Sie Ihre Abfrage wie folgt:
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
Das obige ist der detaillierte Inhalt vonWarum ist meine SQL-Abfrage in SSMS schnell, in ASP.NET jedoch langsam?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!