Oracle SQL连接表第一行结果

时间:2018-04-13 05:24:05

标签: sql oracle

您好我的性能查询有问题。 你能解释一下下面例子之间的区别。第一个查询是否更快?为什么? 谢谢你的帮助

   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

1 个答案:

答案 0 :(得分:0)

保证第一个比第二个更快,但如果您正在观察它,可能有原因。我强调 - 所有这些都是猜想,因为你没有给我们很多信息。

查询1

我可以先得到T3,因为inn.rank谓词而给我一行。然后可以使用该单行进入T1,并且(可能)在'符号'上有一个适当的索引。让我们高效。

查询2

T2返回多行,因此我们可能选择以T3开头并开车进入T2,反之亦然,并且等级= 1的过滤将推迟到加入之后。