oracle使用order by跟rownum效率很慢,有没有提升的办法

oracle使用order by和rownum效率很慢,有没有提升的办法?
sql语句如下:
select * from
    (select * from test where name='a' order by uptime)
         where rownum <=100

如果改成这样写:select * from test where name='a' and rownum <=100 order by uptime,速度明显提高,但是结果是错的,因为这样是先取100条,再排序。

说明:uptime为时间字段,已建立索引,内容有重复,不能设置为主键。

现在库里有一千多万的数据,查询耗时为50来秒,求哪位高能提高下查询速度?
------解决方案--------------------
看http://blog.sina.com.cn/s/blog_5f59fd0d0100co9r.html文章里的一段话
笔者在工作中有一上百万条记录的表,在jsp页面中需对该表进行分页显示, 便考虑用rownum来作,下面是具体方法(每页
显示20条):
“select * from tabname where rownum<20 order by name" 但却发现oracle却不能按自己的意愿来执行,而是先随便
取20条记录,然后再 order by,后经咨询oracle,说rownum确实就这样,想用的话,只能用子查询来实现先排序,后
rownum,方法如下:
"select * from (select * from tabname order by name) where rownum<20",但这样一来,效率会较低很多。
后经笔者试验,只需在order by 的字段上加主键或索引即可让oracle先按该字

------解决方案--------------------
笔者在工作中有一上百万条记录的表,在jsp页面中需对该表进行分页显示, 便考虑用rownum来作,下面是具体方法(每页
显示20条):
“select * from tabname where rownum<20 order by name" 但却发现oracle却不能按自己的意愿来执行,而是先随便
取20条记录,然后再 order by,后经咨询oracle,说rownum确实就这样,想用的话,只能用子查询来实现先排序,后
rownum,方法如下:
"select * from (select * from tabname order by name) where rownum<20",但这样一来,效率会较低很多。
后经笔者试验,只需在order by 的字段上加主键或索引即可让oracle先按该字段排序,然后再rownum;方法不变:
   “select * from tabname where rownum<20 order by name"

------解决方案--------------------
加 top 会比不加top 要效率 
------解决方案--------------------
那可以考虑复合索引,name 和 uptime
------解决方案--------------------
同意楼上,可以再加些字段做索引键,毕竟你SELECT * 的字段可能有些多。
------解决方案--------------------
先排序在取比先取在排序快
------解决方案--------------------
引用:
sql语句如下:
select * from
    (select * from test where name='a' order by uptime)
         where rownum <=100

如果改成这样写:select * from test where name='a' and rownum <=100 order by uptime……

LZ解决了么?我也很想知道
------解决方案--------------------

select top 10 t.name,t.id,t.rowsnum
from
(
  select name,id,row_number() over(order by id) desc as rownum
  from 
  t_table  
) t
where t.rowsnums > 0
1.top 和row_number混合使用
2.不要使用*,标识你要的列名(字段)
3.orderby后跟主键