首先介绍一下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条。
优点:性能好
缺点:随机性差