从oracle表中随机抽取数据,Oracle随机抽取数据

本文介绍了三种在数据库中进行数据采样的方法:随机数、sample函数和结合两者的混合方法。针对1万条数据的测试表,分别讨论了它们的性能和随机性。方法一使用随机数,虽然随机性好但执行时间长;方法二通过sample函数速度快但随机性差;方法三结合两者,既提高速度又增强随机性,但在特定情况下可能无法确保样本数量。测试结果显示,每种方法都有其优缺点,适用于不同的场景。
摘要由CSDN通过智能技术生成

新建了一个测试表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;

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值