2010-01-26 9 views
5

Ho una query che unisce 4 tabelle con molte condizioni nella clausola WHERE. La query include anche la clausola ORDER BY su una colonna numerica. Ci vogliono 6 secondi per tornare, che è troppo lungo e ho bisogno di accelerarlo. Sorprendentemente ho scoperto che se rimuovo la clausola ORDER BY ci vogliono 2 secondi. Perché l'ordine fa una differenza così grande e come ottimizzarlo? Sto usando SQL Server 2005. Molte grazie.Scarsa prestazione della query SQL a causa della clausola ORDER BY

Non riesco a confermare che l'ordine BY fa una grande differenza dal momento che sto svuotando la cache del piano di esecuzione. Tuttavia, puoi far luce su come accelerare un po 'questo? La query è la seguente (per semplicità c'è "SELECT *" ma sto selezionando solo quelli di cui ho bisogno).

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 
+3

Hai esaminato il piano di query? –

+3

prova ad indicizzare la colonna che stai usando nella tua clausola ORDER BY (se non lo hai già fatto) – davek

+2

Assicurati anche di cancellare la cache del piano dati/esecuzione tra ogni test, altrimenti potresti ottenere risultati distorti (peggiore caso in cui essi sono effettivamente eseguire lo stesso, ma il 2 ° corre più veloce in quanto sta ricevendo i dati dalla cache). – AdaTheDev

risposta

6

Perché l'ordine fa così massiccia differenza e come ottimizzarlo?

Il ORDER BY deve ordinare il set di risultati che può 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 e può richiedere anche più tempo.

Se hai qualcosa di diverso equijoins nella query, oppure i predicati a distanza (come <, > o BETWEEN, o GROUP BY clausola), l'indice utilizzato per ORDER BY può impedire agli altri indici vengano utilizzati.

Se pubblichi la query, probabilmente sarò in grado di dirti come ottimizzarlo.

Aggiornamento:

riscrivere 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 

Il rapporto View_Product_Joined, come suggerisce il nome, è probabilmente una vista.

Potresti postare la sua definizione?

Se è indicizzabile, è possibile creare un indice su View_Product_Joined (SiteName, Published, DocumentCulture, SKUEnabled, NodeOrder).

+0

Query posted ... – David

+0

Per eseguire la query ho dovuto aggiungere skuID e siteID come output della query cross apply e dargli anche un nome alias.Ora è molto più veloce, ma restituisce anche circa il 40% dei record. Dovrà investigare ulteriormente. – David

+0

'@ David': ho corretto un po 'la query, per favore vedi l'aggiornamento. 'PriceLookupID' è' PRIMARY KEY' su 'OPR_PriceLookup'? – Quassnoi

Problemi correlati