如何在没有完全扫描的情况下选择10行

时间:2017-08-17 08:30:15

标签: oracle query-optimization

我选择了这样:

select * from 
     (select aa.*,rownum as rn
   from (select someRows 
          from (select * 
                 from table a 
              left outer join mySecTable b)
       left outer join otherTable c 
      where conditions) aa 
  order by aa.myColumn) ff
where ff.rn >=30 and rn<40

我想在没有完全扫描的情况下选择有序数据的10列,但是这个选择正在进行全扫描,无论最后的情况是什么,ff.rn >=30 and rn<40或者没有选择的时间是相同的。

我的主要选择是

select * from
     (select someRows
     from
         (select *
         from myTable a
          left outer join  mySecTable b
    ) left outer join otherTable c 
    where conditions

比我想要订购此选择并采取10行。如果没有完全扫描,我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

似乎,您在指定rownum as rn的同一级别选择order by aa.myColumn。在这种情况下,rn将是无序的,查询将返回无序结果(因为它将rownum分配给行,之后将通过myColumn对它们进行排序)。 您应该将rownum移动到较高的SQL级别(再添加一个)或按顺序移动以降低SQL级别。

如果你有myColumn的索引,那么这个列的条件和&lt;或者&gt;永远回归真实可能有所帮助 像

where myColumn>0 -- for number

where myColumn>chr(0) -- for varchar

所以SQL应该看起来像

select * from 
     (select aa.*,rownum as rn
   from (select someRows 
          from (select * 
                 from table a 
              left outer join mySecTable b)
       left outer join otherTable c 
      where conditions
        AND myColumn>chr(0)
      order by aa.myColumn) aa 
  WHERE rownum < 40) ff
where ff.rn >=30

(我将订单移至较低级别的SQL,添加了myColumn>chr(0)条件并将左边界限移至较低级别SQL rownum<40