免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3023 | 回复: 3
打印 上一主题 下一主题

select检索出的记录按什么顺序出来? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-25 21:46 |只看该作者 |倒序浏览
50可用积分
数据库:ORACLE 9i


如果有一张表里有300万条数据,符合检索条件column1='A' and column2='B'的记录有1000条,但是应用只需要300条,取到游标里。

例如,select * from tablea where column1='A' and column2='B' and rownum<300;

请问,这300条数据是按什么顺序检索出来的呢?是按rowid吗?还是随机的?

假如我希望这300条数据是1000条数据中最先进入表的300条,那么是否上面的语句就可以达到这个目标了?

如果不行,有什么办法能够达到先进入表的记录先读出呢?

我觉得加上order by msgseq或者order by rowid的话会降低效率,而且感觉好像只是对检索出的300条排序。


还有个问题,如果tablea表是变动非常频繁的表,经常有记录增加、删除、修改操作,一天下来增加、删除的记录各有上百万条。
那么这样的表适合建索引吗?



谢谢。

[ 本帖最后由 BlackSnail 于 2007-9-26 16:52 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-09-26 00:27 |只看该作者
一般读数据页既不是随机,也没什么顺序
这句因为用到索引了,那么便按照索引排列顺序一条条读出来

没有办法将先进入表的数据先度出来,除非你insert的时候就搞一个自增长字段,select也order by这个字段。rowid在这里没用

论坛徽章:
0
3 [报告]
发表于 2007-09-26 16:50 |只看该作者
原帖由 raullew 于 2007-9-26 00:27 发表
一般读数据页既不是随机,也没什么顺序
这句因为用到索引了,那么便按照索引排列顺序一条条读出来


您是指select * from tablea where column1='A' and column2='B' and rownum<300;中用到索引了吗?
这个语句里虽然对column1+column2建了一个索引,但这个索引应该无法表达记录进表的顺序。

msgseq是自增索引,能表达进表顺序。现在就是因为表记录越来越多,所以我觉得会降低select效率,如果order by rowid或order by msgseq可能效率更低,不敢用。

论坛徽章:
0
4 [报告]
发表于 2007-09-26 17:15 |只看该作者
原帖由 BlackSnail 于 2007-9-26 16:50 发表


您是指select * from tablea where column1='A' and column2='B' and rownum


如果你的记录都在1000条左右的话,效率只跟column1、column2有关,因为你做了筛选!
column1+column2的索引是不能表达记录进表的顺序的。但是,column1+column2的索引是用来提高效率的。
order by msgseq只是在那一千条记录上排序,不是整表排序。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP