Il ORDER BY
ha bisogno di ordinare il set di risultati che potrebbe richiedere molto tempo se è grande.
Per ottimizzarlo, potrebbe essere necessario indicizzare correttamente le tabelle.
Il percorso di accesso all'indice, tuttavia, ha i suoi svantaggi, quindi può richiedere anche più tempo.
Se hai qualcosa di diverso dagli equijoin nella tua query o dai predicati con intervallo (come <
, >
o BETWEEN
o GROUP BY
clausola), quindi l'indice utilizzato per ORDER BY
potrebbe impedire l'utilizzo degli altri indici.
Se pubblichi la query, probabilmente sarò in grado di dirti come ottimizzarla.
Aggiornamento:
Riscrivi la query:
SELECT *
FROM View_Product_Joined j
LEFT JOIN
[dbo].[OPR_InventoryRules] irp
ON irp.ID = j.skuid
AND irp.InventoryRulesType = 'Product'
LEFT JOIN
[dbo].[OPR_InventoryRules] irs
ON irs.ID = j.NodeSiteID
AND irs.InventoryRulesType = 'Store'
CROSS APPLY
(
SELECT TOP 1 *
FROM OPR_PriceLookup pl
WHERE pl.siteID = j.NodeSiteID
AND pl.skuid = j.skuid
AND pl.RoleID IN (-1, 13)
ORDER BY
pl.RoleID desc
) pl
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
ORDER BY
NodeOrder ASC
La relazione View_Product_Joined
, come suggerisce il nome, è probabilmente una vista.
Potresti postare la sua definizione?
Se è indicizzabile, potresti trarre vantaggio dalla creazione di un indice su View_Product_Joined (SiteName, Published, DocumentCulture, SKUEnabled, NodeOrder)
.