SELECT Trade.TradeId, Trade.Type, Trade.Symbol, Trade.TradeDate,
SUM(TradeLine.Notional)/1000 AS Expr1
FROM Trade INNER JOIN
TradeLine ON Trade.TradeId = TradeLine.TradeId
WHERE (TradeLine.Id IN
(SELECT PairOffId
FROM TradeLine AS TradeLine_1
WHERE (TradeDate <= '2011-05-11')
GROUP BY PairOffId
HAVING (SUM(Notional) <> 0)))
GROUP BY Trade.TradeId, Trade.Type, Trade.Symbol, Trade.TradeDate
ORDER BY Trade.Type, Trade.TradeDate
Me preocupa el rendimiento del IN en la cláusula WHERE cuando la tabla comienza a crecer. ¿Alguien tiene una mejor estrategia para este tipo de consulta? El número de registros devueltos por la subconsulta crece mucho más lento que el número de registros en la tabla TradeLine. La tabla TradeLine en sí misma crece a una velocidad de 10 por día.Rendimiento de consulta WHERE cláusula contiene IN (subconsulta)
Gracias.
EDIT: Utilicé la idea de mover la subconsulta de WHERE a FROM. Voté por todas las respuestas que contribuyeron a esta nueva consulta.
SELECT Trade.TradeId, Trade.Type, Trade.Symbol, Trade.TradeDate,
PairOff.Notional/1000 AS Expr1
FROM Trade INNER JOIN
TradeLine ON Trade.TradeId = TradeLine.TradeId INNER JOIN
(SELECT PairOffId, SUM(Notional) AS Notional
FROM TradeLine AS TradeLine_1
WHERE (TradeDate <= '2011-05-11')
GROUP BY PairOffId
HAVING (SUM(Notional) <> 0)) AS PairOff ON TradeLine.Id = PairOff.PairOffId
ORDER BY Trade.Type, Trade.TradeDate
No puedes invertir el orden? Ejecute la subconsulta como la consulta externa, luego la consulta externa como la subconsulta. – soandos
@soandos - ¿tiene alguna idea de cómo funcionan los RDBMS? – JNK
Sí, aunque no mucho. Estaba mirando como si (a) si (b) donde el ciclo externo toma más tiempo que el interno. así que invertirlos da el mismo resultado, pero más rápido – soandos