Oracle取随机数据

随机查看前N条记录(随机读取表内容)
select * from (select * from tb_phone_no order by sys_guid())
where rownum < 10;

 

SELECT * FROM (SELECT * FROM chifan ORDER BY dbms_random.random) WHERE ROWNUM<=5;

 

 

SQL> SELECT * FROM (SELECT * FROM A SAMPLE(0.01)) WHERE ROWNUM<=1;

DT
-----------------
20050105 14:59:52

SQL> SELECT * FROM (SELECT * FROM A SAMPLE(0.01)) WHERE ROWNUM<=1;

DT
-----------------
20050306 00:43:05

SQL> SELECT * FROM (SELECT * FROM A SAMPLE(0.01)) WHERE ROWNUM<=1;

DT
-----------------
20050406 02:59:50

注意每次取得的值都不同。

SAMPLE 是随机抽样,后面的数值是采样百分比。
我的测试表A是10万条,所以取0.01% 也就是 万分之一,这样返回记录数大约10条。
对于你的情况,你可以根据数据量来控制采样百分比。

 

oracle 中随机取数据的方法:

1.快速随机取数据(推荐使用):

select * from MEMBER sample(1) where rownum <= 10

2.随机取数据,较慢

select * from (
select * from MEMBER order by dbms_random.value
) where rownum<=10

========原文========

最近在做系统时用到了随机抽取记录的问题;

上网上查找了很多相关资料,发现了不同的方法及其差异。都是基于ORACLE的方法哦

首先第一个是随机抽取6个

select * from (select * from tablename order by order by dbms_random.value) where rownum<7

这个方法的原理我认为应该是把表中的数据全部查询出来按照随机数进行排列后在从查询出来的数据中查询中6条记录,这个方法我在使用的过程中发现,如果记录一多的话查询的速度有一点点的慢,测试时是7000条,如果几万几十万的话可能就更慢了;

第二个是利用oracle的sample()或sample block方法

select * from tablename sample ( 50 ) where rownum<6

这个稍稍介绍一下sample

Oracle访问数据的基本方法有:
1.全表扫描
2.采样表扫描

全表扫描(Full table Scan)
全表扫描返回表中所有的记录。
执行全表扫描,Oracle读表中的所有记录,考查每一行是否满足WHERE条件。Oracle顺序的读分配给该表的每一个数据块,这样全表扫描能够受益于多块读.
每个数据块Oracle只读一次.

采样表扫描(sample table scan)
采样表扫描返回表中随机采样数据。
这种访问方式需要在FROM语句中包含SAMPLE选项或者SAMPLE BLOCK选项.

SAMPLE选项:
当按行采样来执行一个采样表扫描时,Oracle从表中读取特定百分比的记录,并判断是否满足WHERE子句以返回结果。

SAMPLE BLOCK选项:
使用此选项时,Oracle读取特定百分比的BLOCK,考查结果集是否满足WHERE条件以返回满足条件的纪录.

Sample_Percent:
Sample_Percent是一个数字,定义结果集中包含记录占总记录数量的百分比。
Sample值应该在[0.000001,99.999999]之间。

主要注意以下几点:

1.sample只对单表生效,不能用于表连接和远程表
2.sample会使SQL自动使用CBO

posted @ 2015-01-20 09:46  刘竹青  阅读(795)  评论(0编辑  收藏  举报