oracle随机读取表中的N条数据方法:
1) select * from (select * from tablename order by sys_guid()) where rownum 2) select * from (select * from tablename order by dbms_random.value) where rownum3) select * from (select * from table_name sample(10) order by trunc(dbms_random.value(0, 1000))) where rownum 说明:
sample(10)含义为检索表中的10%数据,sample值应该在[0.000001,99.999999]之间,其中 sys_guid() 和 dbms_random.value都是内部函数
注:
在使用sys_guid()方法时,有时会获取到相同的记录,即和前一次查询的结果集是一样的。这种情况可能与操作系统有关,例如在Windows系统下正常,在Linux系统下异常。另外,sys_guid()函数本身可能存在问题,需要进一步研究。
为确保在不同平台读取的数据都是随机的,建议采用2)和3)两种方案。其中2)方案更常用,3)方案则适用于查询大表且提取数据不多的情况下,能提高查询速度。
oracle随机读取表中的N条数据方法:
1
2
3
1) select * from (select * from tablename order by sys_guid()) where rownum 2) select * from (select * from tablename order by dbms_random.value) where rownum3) select * from (select * from table_name sample(10) order by trunc(dbms_random.value(0, 1000))) where rownum
说明:
sample(10)含义为检索表中的10%数据,sample值应该在[0.000001,99.999999]之间,其中 sys_guid() 和 dbms_random.value都是内部函数
注:
在使用sys_guid()方法时,有时会获取到相同的记录,即和前一次查询的结果集是一样的。这种情况可能与操作系统有关,例如在Windows系统下正常,在Linux系统下异常。另外,sys_guid()函数本身可能存在问题,需要进一步研究。
为确保在不同平台读取的数据都是随机的,建议采用2)和3)两种方案。其中2)方案更常用,3)方案则适用于查询大表且提取数据不多的情况下,能提高查询速度。
这几天工作上的需要,要从一个比较大的表中随机取出一条记录,oracle 不像MS SQLSERVER那样,直接用Select TOP 1 * From TABLE Order By NewID(),就能高效的随机查出一条记录。经过一翻折腾,用一个有90万条记录的表t_id,只有一个gameid字段,该字段上没有索引,表里就是从100000到999999一连串的数据记录,进行测试:
方法1.
采用rownum和dbms_random.value,平均用时5秒,这个效率确实是太低了,对于小表应该还行,大表那就太不适合了。
declare
n_id number(6);
begin
SELECT gameid into n_id FROM(SELECT gameid FROM t_id T ORDER BY dbms_random.value()) WHERE ROWNUM=1;
dbms_output.put_line(to_char(n_id));
end;
/
方法2.
采用oracle sample语法,设置随机样本是1%,结果用时0.01左右,速度是相当快的,但是根据官网的说法,采用sample采集特性可能会产生不准确的结果集,我在测试中是没有碰到不正确的结果。但是有个问题,就是随机的结果分布很不平均,结果几乎都分内存卡在100000-200000的记录中。效率虽好,但并没有达到很好的随机效果,如果对于结果的要不是很高的,这个方法是相当不错的。
declare
n_id number(6);
begin
SELECT gameid into n_id FROM t_id SAMPLE (1) WHERE ROWNUM = 1;
dbms_output.put_line(to_char(n_id));
end;
/
方法3.
采用minus语法,先随机获取一个在表总记录数范围内的一个随机数,再通过rownum查询两个结果集只相差一条记录,用minus相减留出事先随机数的那条记录,平均用时大概1秒,随机数越小,查询速度越快,当随机数是20000时,用于0.016秒。该方法虽然
能得到很有随机效果,但效率比较不上该方法2. 对效率要一般的话, 还是可以考虑使用的。
declare
n_count int:=0;
n_rand_num int:=0;
n_id number(6);
begin
SELECT COUNT(*) INTO n_count FROM t_id;
SELECT trunc(dbms_random.value(1,n_count+1)) INTO n_rand_num FROM DUAL;
select gameid into n_id from (SELECT gameid FROM t_id T WHERE rownum minus SELECT gameid FROM t_id T WHERE rownum dbms_output.put_line(to_char(n_id)); end; /
以上是如何随机选择一条记录从一个表中的详细内容。更多信息请关注PHP中文网其他相关文章!