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
当表开始增长时,我担心IN在WHERE子句中的性能。有没有人有这种查询更好的策略?子查询返回的记录数量增长得比TradeLine表中记录的数量慢得多。 TradeLine表格本身的增长速度为每天10个。查询性能WHERE子句包含IN(子查询)
谢谢。
编辑: 我使用了将子查询从WHERE移动到FROM的想法。我对所有对这个新查询做出贡献的答案投了赞成票。
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
你不能颠倒顺序?将子查询作为外部查询运行,然后将外部查询作为子查询运行。 – soandos 2011-05-11 20:43:09
@soandos - 你有什么想法RDBMS的工作? – JNK 2011-05-11 20:45:44
是的,虽然不是很多。 (a) if(b) 其中外环比内环需要更多的时间。所以扭转他们给出了相同的结果,但更快 – soandos 2011-05-11 20:53:57