Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Schlechte Leistung der SQL-Abfrage aufgrund der ORDER BY-Klausel

Der ORDER BY muss die Ergebnismenge sortieren, was lange dauern kann, wenn sie groß ist.

Um es zu optimieren, müssen Sie die Tabellen möglicherweise richtig indizieren.

Der Index-Zugriffspfad hat jedoch seine Nachteile, sodass er sogar länger dauern kann.

Wenn Ihre Abfrage etwas anderes als Equijoins oder die Bereichsprädikate (wie < , > oder BETWEEN , oder GROUP BY -Klausel), dann der für ORDER BY verwendete Index kann verhindern, dass die anderen Indizes verwendet werden.

Wenn Sie die Abfrage posten, kann ich Ihnen wahrscheinlich sagen, wie Sie sie optimieren können.

Aktualisierung:

Schreiben Sie die Abfrage neu:

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

Die Relation View_Product_Joined , wie der Name schon sagt, ist wahrscheinlich eine Ansicht.

Könntest du bitte seine Definition posten?

Wenn es indexierbar ist, können Sie davon profitieren, einen Index für View_Product_Joined (SiteName, Published, DocumentCulture, SKUEnabled, NodeOrder) zu erstellen .