8 Stimmen

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

Ich habe eine Abfrage, die 4 Tabellen mit einer Vielzahl von Bedingungen in der WHERE-Klausel verbindet. Die Abfrage enthält auch eine ORDER BY-Klausel für eine numerische Spalte. Die Rückgabe dauert 6 Sekunden, was zu lang ist und ich muss sie beschleunigen. Überraschenderweise habe ich festgestellt, dass die Abfrage nur 2 Sekunden dauert, wenn ich die ORDER BY-Klausel entferne. Warum macht die ORDER BY-Klausel einen so großen Unterschied und wie kann ich sie optimieren? Ich verwende SQL Server 2005. Vielen Dank!

Ich kann nicht bestätigen, dass das ORDER BY einen großen Unterschied macht, da ich den Ausführungsplan-Cache lösche. Können Sie mir jedoch sagen, wie ich das Ganze ein wenig beschleunigen kann? Die Abfrage ist wie folgt (der Einfachheit halber gibt es "SELECT *", aber ich wähle nur die, die ich brauche).

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

9voto

Quassnoi Punkte 396418

Warum macht die Reihenfolge einen so großen Unterschied und wie kann man sie optimieren?

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

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

Der Indexzugriffsweg hat jedoch seine Nachteile, so dass er sogar länger dauern kann.

Wenn Sie etwas anderes als equijoins in Ihrer Abfrage haben, oder die ranged-Prädikate (wie < , > o BETWEEN o GROUP BY Klausel), dann wird der Index, der für ORDER BY kann dazu führen, dass die anderen Indizes nicht verwendet werden können.

Wenn Sie die Anfrage stellen, 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 Beziehung View_Product_Joined ist, wie der Name schon sagt, wahrscheinlich eine Aussicht.

Könnten Sie bitte die Definition des Begriffs angeben?

Wenn sie indizierbar ist, können Sie davon profitieren, einen Index auf View_Product_Joined (SiteName, Published, DocumentCulture, SKUEnabled, NodeOrder) .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X