Heim > Datenbank > MySQL-Tutorial > Warum ist meine SQL-Abfrage in SSMS schnell, in ASP.NET jedoch langsam?

Warum ist meine SQL-Abfrage in SSMS schnell, in ASP.NET jedoch langsam?

Linda Hamilton
Freigeben: 2024-12-31 21:54:14
Original
958 Leute haben es durchsucht

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

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage