Maison >base de données >tutoriel mysql >Pourquoi ma requête SQL est-elle rapide dans SSMS mais lente dans 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!