posts - 262,  comments - 221,  trackbacks - 0
【1】方法一:通过dbms_random.random
select * from (select * from largetable order by dbms_random.random) where rownum <= 20000;

【2】方法二:通过dbms_random.value
select * from (select * from largetable order by dbms_random.value) where rownum <= 20000;

【3】方法三:通过采样表扫描
select * from (select * from largetable sample(10)) where rownum <= 20000;

下面我们通过实践来比较这3种方法的效率,首先我们创建一个包含有10W条记录的表用于实验:
create table LARGETABLE
(
  ID       
NUMBER not null primary key,
  BIRTHDAY DATE 
not null
)

接下来我们插入10W条数据
create or replace procedure random_insert as
  i         
number;
  startDate date :
= sysdate;

begin

  
for i in 1 .. 100000 loop
    
insert into largetable values (i, startDate + 1);
  
end loop commit;

end;

在SQL*PLUS下设置显示SQL语句执行时间:set timing on,让后分别运行上述三条语句:

第一个的执行时间为 00: 00: 16: 04
第二个的执行时间为 00: 00: 54: 04
第三个的执行时间为 00: 00: 08: 07

从这里我们可以看出在进行数据随机抽取时,采用sample的方法效率是最高的。为了保证每次随机查询的数据尽量不重复,我们可以把sample中的百分比提高一些(例如从10%提高到20%)。

关于Oracle Sample的介绍和用法,请参考eygle他老人家的一篇文章介绍:如何从结果集中获得随机结果


-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要尽力打好一手烂牌。
posted on 2008-06-09 17:41 Paul Lin 阅读(1932) 评论(3)  编辑  收藏 所属分类: Oracle 开发


FeedBack:
# re: 【原】Oracle开发专题之:随机查询
2009-02-23 11:36 | wxf0701@gmail.com
俺的测试结果跟你的很不一样哦,你多次运行下看看  回复  更多评论
  
# re: 【原】Oracle开发专题之:随机查询[未登录]
2009-03-19 15:29 | peter
用sample代表取样阿,我查询时如果戴上查询条件,如果用sample得到的查询结果数量可能不对啊,多次查询的数目不同?  回复  更多评论
  
# re: 【原】Oracle开发专题之:随机查询
2009-05-17 17:13 | 初学者
看了大侠的oracle的博文,受益颇深。现有一问题想求,望复:
在一个SQL语句中,进行表连接的最合适的表的个数是多少?例如,在一个sql语句中,涉及到了4张表连接。如果,一个sql语句涉及了10张表进行连接,是不是说明数据库的表的设计有问题?那,一个什么样的表连接数值才是合适的数据库表的设计呢?

谢谢。
祝顺利,健康。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
<2008年6月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

常用链接

留言簿(21)

随笔分类

随笔档案

BlogJava热点博客

好友博客

搜索

  •  

最新评论

阅读排行榜

评论排行榜