Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Scarse prestazioni della query SQL a causa della clausola ORDER BY

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) .