2010-01-26 10 views
5

Tengo una consulta que une 4 tablas con muchas condiciones en la cláusula WHERE. La consulta también incluye la cláusula ORDER BY en una columna numérica. Se tarda 6 segundos en volver, que es demasiado largo y necesito acelerarlo. Sorprendentemente, encontré que si eliminé la cláusula ORDER BY tardo 2 segundos. ¿Por qué el orden hace una diferencia tan enorme y cómo optimizarlo? Estoy usando SQL Server 2005. Muchas gracias.Mal rendimiento de la consulta SQL debido a la cláusula ORDER BY

No puedo confirmar que el ORDER BY haga una gran diferencia ya que estoy borrando el caché del plan de ejecución. Sin embargo, ¿puedes arrojar luz sobre cómo acelerar esto un poco? La consulta es la siguiente (por simplicidad, hay "SELECCIONAR *", pero solo estoy seleccionando los que necesito).

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

¿Has mirado el plan de consulta? –

+3

intente indexar la columna que está utilizando en su cláusula ORDER BY (si no lo ha hecho aún, es decir) – davek

+2

También asegúrese de borrar la caché del plan de datos/ejecución entre cada prueba, de lo contrario podría obtener resultados sesgados (peor En el caso hipotético, en realidad sí tienen el mismo rendimiento, pero el segundo funciona más rápido ya que está obteniendo datos del caché). – AdaTheDev

Respuesta

6

Por qué la orden por diferencia hace tan masivo y cómo optimizarlo?

Los ORDER BY necesidades para ordenar el conjunto de resultados que puede tomar mucho tiempo si es grande.

Para optimizarlo, es posible que deba indexar las tablas correctamente.

La ruta de acceso del índice, sin embargo, tiene sus desventajas, por lo que incluso puede llevar más tiempo.

Si usted tiene algo más que equijoins en su consulta, o los predicados a distancia (como <, > o BETWEEN, o GROUP BY cláusula), entonces el índice utilizado para ORDER BY puede impedir que los otros índices se utilicen.

Si publica la consulta, probablemente pueda decirle cómo optimizarla.

Actualización:

reescribir la consulta:

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 relación View_Product_Joined, como su nombre indica, es probablemente una vista.

¿Podría publicar su definición?

Si es indexable, puede beneficiarse al crear un índice en View_Product_Joined (SiteName, Published, DocumentCulture, SKUEnabled, NodeOrder).

+0

Consulta publicada ... – David

+0

Para ejecutar la consulta, tuve que agregar skuID y siteID como salida de la consulta de aplicación cruzada, y también darle un nombre de alias.Ahora es mucho más rápido, pero también devuelve aproximadamente el 40% de los registros. Tendrá que investigar más. – David

+0

'@ David': corregí un poco la consulta, consulte la actualización de la publicación. ¿'PriceLookupID' es' PRIMARY KEY' en 'OPR_PriceLookup'? – Quassnoi

Cuestiones relacionadas