Oracle随机抽取记录的方法


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

    上网上查找了很多相关资料,发现了不同的方法及其差异。都是基于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

    看法

    我在测试sample的时候发现如果我的表中数据有20条,按照它的sample值我写这样的sql: select * from tablename sample(50)   应该结果集中的数据占总数据的50%才对,但是多次执行之后的结果却是多少数据都有,小于50%、大于50%的都有,这跟 Sample_Percent是一个数字,定义结果集中包含记录占总记录数量的百分比 的说明不符,而且用sample block时有时候还能查询出空结果集(select * from tablename sample block(50)) ,不知道是不是我对这个理解不够还是。。。,反正感觉很疑惑;


« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3