Maison >base de données >tutoriel mysql >Pourquoi ma requête SQL est-elle rapide dans SSMS mais lente dans ASP.NET ?

Pourquoi ma requête SQL est-elle rapide dans SSMS mais lente dans ASP.NET ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-31 21:54:14959parcourir

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

Comprendre les écarts de performances SQL entre SSMS et ASP.NET

Vous constatez une différence de performances significative lors de l'exécution d'une requête SQL dans SSMS par rapport vers ASP.NET. La requête, illustrée ci-dessous, s'exécute en quelques secondes dans SSMS, mais elle prend quelques minutes sur votre site Web.

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

Le coupable : le reniflage des paramètres

Le la cause la plus probable de cet écart est le reniflage des paramètres. Le reniflage de paramètres est une technique d'optimisation des performances dans laquelle SQL Server analyse les paramètres de requête lors de sa première exécution et crée un plan d'exécution basé sur ces paramètres. Si les paramètres de requête changent ultérieurement, SQL Server risque de ne pas recompiler le plan d'exécution et de continuer à utiliser le plan d'origine, ce qui peut ne pas être optimal pour les nouveaux paramètres.

Dans ce cas, les performances de la requête se dégradent probablement car le Le plan d'exécution optimisé pour la première fois que vous exécutez la requête avec une valeur spécifique pour @CustID n'est pas idéal pour les exécutions ultérieures avec des valeurs @CustID différentes.

Résoudre le problème Problème

Pour atténuer le reniflage des paramètres, vous pouvez utiliser l'indice FORCESEEK dans la requête. Cela oblige SQL Server à créer un nouveau plan d'exécution pour chaque exécution de la requête, garantissant qu'il utilise le plan optimal pour les paramètres donnés.

Pour résoudre le problème, modifiez votre requête comme suit :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn