2017-08-17 12 views
0

我选择这样的:如何选择10排不完整扫描

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行。我怎样才能做到这一点没有全面扫描?

+2

您的目标不应该是消除完整扫描,而应该是尽可能执行查询 - 可能是最好的可能的方式是使用全面扫描。仅仅从查看查询就不可能说,但如果有'myColumn'上的索引,优化器*可能会使用该索引来避免全面扫描 - 但它很可能不会。 –

回答

0

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

如果您myColumn有索引,然后在那里与此列和<或>总是返回true条件可以帮助 像

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 

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