Can*_*hiu 5 sql sqlperformance
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
Run Code Online (Sandbox Code Playgroud)
当表开始增长时,我担心WHERE子句中IN的性能.有没有人对这种查询有更好的策略?子查询返回的记录数比TradeLine表中的记录数慢得多.TradeLine表本身以10 /天的速度增长.
谢谢.
编辑:我使用了将子查询从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
Run Code Online (Sandbox Code Playgroud)
IN子句中的子查询不依赖于外部查询中的任何内容.你可以安全地将其移入FROM条款; 一个理智的查询计划构建器会自动执行它.
此外,调用EXPLAIN PLAN您将要在生产中使用的任何查询是必须的.这样做,看看DBMS对此查询计划的看法.