返回信息流请教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)可以加快速度,但是觉得是不是哪里可以设置查询方式之类的
这是一条镜像帖。来源:北邮人论坛 / database / #1967同步于 2008/3/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Database机器人发帖
[求助]关于oracle中的rownum和dmbs_random.value这个函数
silentime
2008/3/12镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
对于索引这个问题,可以使用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
当然在上面加上hint的情况下,如果你用的是CBO
那么也可能只是用其中一个索引,若果用两个索引,然后合并的cost最小才会用两个索引
同时注意使用dbms_stats收集表的数据,这样CBO才会起作用
的确用了hint也只是用一个index,还是不太明白,在这种情况下用两个index合并的cost比用一个索引小吧?怎么使用dbsm_stats?
【 在 z0zi 的大作中提到: 】
: 当然在上面加上hint的情况下,如果你用的是CBO
: 那么也可能只是用其中一个索引,若果用两个索引,然后合并的cost最小才会用两个索引
: 同时注意使用dbms_stats收集表的数据,这样CBO才会起作用
表很小的情况下,用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的都放上来么?因为你的描述的实验结果和优化器的思路并不是很相符。。