J'ai une requête joignant 4 tables avec beaucoup de conditions dans la clause WHERE. La requête inclut également la clause ORDER BY sur une colonne numérique. Il faut 6 secondes pour revenir, ce qui est trop long et je dois l'accélérer. Étonnamment, j'ai trouvé que si je supprime la clause ORDER BY cela prend 2 secondes. Pourquoi la commande fait tellement de différence et comment l'optimiser? J'utilise SQL Server 2005. Merci beaucoup.Mauvaise performance de requête SQL en raison de la clause ORDER BY
Je ne peux pas confirmer que ORDER BY fait une grande différence puisque j'efface le cache du plan d'exécution. Cependant pouvez-vous faire la lumière sur la façon d'accélérer un peu? La requête est la suivante (pour simplifier, il y a "SELECT *" mais je ne sélectionne que ceux dont j'ai besoin).
SELECT *
FROM View_Product_Joined j
INNER JOIN [dbo].[OPR_PriceLookup] pl on pl.siteID = NodeSiteID and pl.skuid = j.skuid
LEFT JOIN [dbo].[OPR_InventoryRules] irp on irp.ID = pl.SkuID and irp.InventoryRulesType = 'Product'
LEFT JOIN [dbo].[OPR_InventoryRules] irs on irs.ID = pl.siteID and irs.InventoryRulesType = 'Store'
WHERE (((((SiteName = N'EcommerceSite') AND (Published = 1)) AND (DocumentCulture = N'en-GB')) AND (NodeAliasPath LIKE N'/Products/Cats/Computers/Computer-servers/%')) AND ((NodeSKUID IS NOT NULL) AND (SKUEnabled = 1) AND pl.PriceLookupID in (select TOP 1 PriceLookupID from OPR_PriceLookup pl2 where pl.skuid = pl2.skuid and (pl2.RoleID = -1 or pl2.RoleId = 13) order by pl2.RoleID desc)))
ORDER BY NodeOrder ASC
Avez-vous regardé le plan de requête? –
essayez d'indexer la colonne que vous utilisez dans votre clause ORDER BY (si ce n'est pas déjà fait) – davek
Assurez-vous également d'effacer le cache de plan de données/d'exécution entre chaque test, sinon vous pourriez obtenir des résultats faussés (pire scénario de cas est qu'ils exécutent effectivement la même chose, mais le 2e s'exécute plus rapidement car il obtient des données à partir du cache). – AdaTheDev