Oracle随机抽取数据

原创
2011/05/19 14:27
阅读数 2.2K

新建了一个测试表Test,里面只有一个递增的字段“ID”,1万条数据。测试脚本中需把insert语句中的select子句作相应的替换

方法一,使用随机数:

select * from (
  select * from test order by dbms_random.value
) where rownum <= 50
这是最原始的方法,测试脚本执行了49分钟还没结束,手动停了。测试结果能涵盖1万条数据,命中次数最高是343次,最低是209次

优点:随机性好

缺点:性能差

方法二,使用sample函数:

select * from test sample(10) where rownum<=50;

测试脚本11秒就执行完,但测试结果只涵盖了805条数据,并且分布非常不均匀,命中次数最高是10133次,最低只有1次

优点:性能最好

缺点:随机性最差

方法三,结合sample和随机数:

select * from (
  select * from test sample(10) order by dbms_random.value
) where rownum <= 50
先用sample抽取部分数据,再用随机数排序。测试脚本运行10分钟,测试结果涵盖1万条数据,命中次数最高589次,最低423次

优点:性能比方法一好,随机性比方法二好

缺点:因为用了sample函数,当数据量比较少时,不能保证每次都能返回50条样本数据。抽样的表不能用dblink

测试脚本

declare
  l_num number := 1;
begin
  execute immediate 'truncate table test_result';
  while l_num <= 100000 loop
    insert into test_result
      (result)
      (select *
         from (select * from test order by dbms_random.value)
        where rownum <= 50);
    if mod(l_num, 1000) = 0 then
      commit;
    end if;
    l_num := l_num + 1;
  end loop;
  commit;
end;

 

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
2 收藏
0
分享
返回顶部
顶部