oracle数据库随机取样的几种方式比较

首先介绍一下Oracle访问数据的两种基本方法:全表扫描和采样表扫描

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

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

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

2.2、 SAMPLE BLOCK选项:使用此选项时,Oracle读取特定百分比的BLOCK,考查结果集是否满足WHERE条件以返回满足条件的纪录。Sample值应该在[0.000001,99.999999]之间。
主要注意以下几点:

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

根据以往使用历史,用过下边三种随机抽样方法,并对他们的随机性及性能(查询速度)对比做个展示:

第一种:

select * from (select * from table order by dbms_random.value) where rownum <= 5

描述:先把表中的数据全部查询出来并按照随机数进行排列,然后再从查询出来的数据中选择前5条。
优点:随机性最好
缺点:性能最差

第二种:

select * from table sample(50) where rownum<=5

描述:从表中读取50%的记录,并返回结果表中5条记录
优点:性能最好
缺点:随机性最差

第三种:

扫描二维码关注公众号,回复: 10367941 查看本文章
select * from (select * from table sample(50) order by dbms_random.value) where rownum <= 5

描述:是前两种方法的折中,先把表中的数据读取50%的记录并按照随机数进行排列,然后再从查询出来的数据中选择前5条。
优点:性能好
缺点:随机性差

发布了27 篇原创文章 · 获赞 134 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/yawei_liu1688/article/details/78893793