BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / database / #1967同步于 2008/3/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Database机器人发帖

[求助]关于oracle中的rownum和dmbs_random.value这个函数

silentime
2008/3/12镜像同步4 回复
请教rownum生成的细节 select rownum as id, xxx,xxx from (select * from tablename ) where id=dbms_random.value(min,max) 这样的结果好像很诡异,想知道oracle的rownum生成的机制 另外顺便问另外一个问题,例如ip数据库这样的需要范围查询 for example: create table ip_address (ip_from number, ip_to number, location varchar(10)) create index idx_ip_from on ip_address(ip_from) create index idx_ip_to on ip_address(ip_to) 如果需要查一个ip地址的话: select * from ip_address where ip>ip_from and ip<ip_to 发现只用到了ip_from这个索引,因此好像也就做了全表扫描,怎么样让它两个索引都用上?用max(ip_from)可以加快速度,但是觉得是不是哪里可以设置查询方式之类的
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
z0zi机器人#1 · 2008/3/13
对于索引这个问题,可以使用hints就可以控制访问路径(access path) 如你想使用两个索引,可以这么写: select /*+ INDEX(ip_address idx_ip_from idx_ip_to) */ * from ip_address where ip>ip_from and ip<ip_to; 这样就可以了 关于rownum http://www.cnblogs.com/temptation/archive/2007/05/16/748897.html
z0zi机器人#2 · 2008/3/13
当然在上面加上hint的情况下,如果你用的是CBO 那么也可能只是用其中一个索引,若果用两个索引,然后合并的cost最小才会用两个索引 同时注意使用dbms_stats收集表的数据,这样CBO才会起作用
silentime机器人#3 · 2008/3/19
的确用了hint也只是用一个index,还是不太明白,在这种情况下用两个index合并的cost比用一个索引小吧?怎么使用dbsm_stats? 【 在 z0zi 的大作中提到: 】 : 当然在上面加上hint的情况下,如果你用的是CBO : 那么也可能只是用其中一个索引,若果用两个索引,然后合并的cost最小才会用两个索引 : 同时注意使用dbms_stats收集表的数据,这样CBO才会起作用
z0zi机器人#4 · 2008/3/19
表很小的情况下,用index是不如full scan的,因为DB_FILE_MUTILBLOCK_READ_COUNT这个参数就大于你的表的block数,这样一次I/O整个表都已经被读入了,相比于index scan的顺序读,这个明显快很多,我想你这个也只是个实验表吧,并不是太大对吧。 当OPTIMIZER_MODE设置为RULE时,采用RBO优化器。当OPTIMIZER_MODE设置为CHOOSE且查询的所有表都不包含统计信息时,也会采用RBO优化器。 Oracle 对访问路径进行了排名,在排名中,全表扫描排在了最后面,也就是说,只要存在其他的可能性,RBO就不会采用全表扫描。RBO认为排名在前的访问一定比排名在后的快,这在大多数情况下是正确的,但是很多时候RBO选择的执行计划与CBO选择的相比效率上要差的多。 能把你的执行计划加hint和不加hint的都放上来么?因为你的描述的实验结果和优化器的思路并不是很相符。。