最近在作系统时用到了随机抽取记录的问题; sql
上网上查找了不少相关资料,发现了不一样的方法及其差别。都是基于ORACLE的方法哦 oracle
首先第一个是随机抽取6个 dom
select * from (select * from tablename order by order by dbms_random.value) where rownum<7 测试
这个方法的原理我认为应该是把表中的数据所有查询出来按照随机数进行排列后在从查询出来的数据中查询中6条记录,这个方法我在使用的过程当中发现,若是记录一多的话查询的速度有一点点的慢,测试时是7000条,若是几万几十万的话可能就更慢了; table
第二个是利用oracle的sample()或sample block方法 原理
select * from tablename sample ( 50 ) where rownum<6 随机数
这个稍稍介绍一下sample select
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
见解
我在测试sample的时候发现若是个人表中数据有20条,按照它的sample值我写这样的sql: select * from tablename sample(50) 应该结果集中的数据占总数据的50%才对,可是屡次执行以后的结果倒是多少数据都有,小于50%、大于50%的都有,这跟 Sample_Percent是一个数字,定义结果集中包含记录占总记录数量的百分比 的说明不符,并且用sample block时有时候还能查询出空结果集(select * from tablename sample block(50)) ,不知道是否是我对这个理解不够仍是。。。,反正感受很疑惑;