您好我的性能查询有问题。 你能解释一下下面例子之间的区别。第一个查询是否更快?为什么? 谢谢你的帮助
SELECT t1.symbol, t3.high, t3.low, t3.timestamp
FROM Table1 t1
JOIN (
SELECT inn.*
FROM (SELECT t2.*, (ROW_NUMBER() OVER(PARTITION BY symbol ORDER BY timestamp DESC)) As Rank
FROM Table2 t2) inn
WHERE inn.Rank=1
) t3
ON t1.symbol = t3.symbol;
和
SELECT t1.symbol, t2.high, t2.low, t2.timestamp
FROM Table1 t1
JOIN (
SELECT t2.*, ROW_NUMBER() OVER(PARTITION BY symbol ORDER BY timestamp DESC) As Rank
FROM Table2) t2
ON t1.symbol = t2.symbol
and t2.Rank =1
答案 0 :(得分:0)
保证第一个比第二个更快,但如果您正在观察它,可能有原因。我强调 - 所有这些都是猜想,因为你没有给我们很多信息。
查询1
我可以先得到T3,因为inn.rank谓词而给我一行。然后可以使用该单行进入T1,并且(可能)在'符号'上有一个适当的索引。让我们高效。
查询2
T2返回多行,因此我们可能选择以T3开头并开车进入T2,反之亦然,并且等级= 1的过滤将推迟到加入之后。