ITPUB??ì3
12月微软Hyper-V虚拟化沙龙主题征集
ITPUB论坛 » Oracle开发 » 取查询结果的前15条数据是不是可以这样写

标题: [SQL] 取查询结果的前15条数据是不是可以这样写
离线 star_guan2008
初级会员


来自 北京
精华贴数 0
个人空间 1926
技术积分 1218 (1471)
社区积分 32 (6249)
注册日期 2007-8-8
论坛徽章:1
生肖徽章2007版:鼠     
      

发表于 2008-9-24 12:29 
select * from (select col1 from test order by col1) t1 where rownum <=15;


__________________
要失业了!
只看该作者    顶部
离线 xipipku
中级会员



精华贴数 0
个人空间 0
技术积分 624 (3104)
社区积分 2 (25265)
注册日期 2004-5-11
论坛徽章:2
授权会员开发板块每日发贴之星    
      

发表于 2008-9-24 14:18 


QUOTE:
原帖由 Laurence.li 于 2008-9-24 12:15 发表
其实楼主是希望提高查询的效率,我提供一种方案供参考:
如果每次查询都是desc排序,就干脆建立desc索引:
create index idx1 on test(col1 desc);
analyze table test estimate statistics for table for all indexes for all indexed columns;
select /*+ index(test idx1) */ col1 from test where rownum < 16;
这样查询出来就是降序排列的前15条了。

如果有时查降序,有时又查升序,那还是建立普通索引:
create index idx2 on test(col1);
analyze ......
查asc前15条:
select /*+ index(test idx2) */ col1 from test where rownum < 16;
查desc前15条:
select /*+ index_desc(test idx2) */ col1 from test where rownum < 16;

以上方法供参考,楼主还须多测试,把数据打乱测试一下,确保正确性后,检验效率,目的其实就是希望不再访问表,而仅仅通过索引取出前15条,当然,你这个col1字段应该是not null的,否则你最好在查询里加上where col1 is not null的查询条件
还有就是,sql的执行和oracle的版本也是有关系的,以上方法曾在9i里用过,问题应该不大,更早的版本就不得而知了,呵呵

用这个方法应该不错的,我每次使用的都是降序,问一下楼主,建完降序索引后是不是可以直接用
select /*+ index(test idx1) */ col1 from test where rownum < =15
我建完索引后随机加过一些数据,测试是正确的,就不知道数据量大以后是不是有问题


只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问