利用SAMPLE随机取数据
Oct232011
目前负责的这个数字化项目,需要开发个质检工具,实现每次随机取20%的数据进行质检,开发人员问我如何实现随机取20%的数据。
使用ORACLE的sample可以很容易实现,但是ORACLE返回的结果不是很准确。
SQL> select count(*) from t001; COUNT(*) ---------- 500
执行计划
---------------------------------------------------------- Plan hash value: 3039494805 -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 500 | 21500 | 4 (0)| 00:00:01 | | 1 | TABLE ACCESS FULL| T001 | 500 | 21500 | 4 (0)| 00:00:01 | --------------------------------------------------------------------------
此次查询ORACLE扫描的所有的数据块,SAMPLE随机读取表中的数据,只读取部分数据块。
SQL> select count(*) from t001 sample(20); COUNT(*) ---------- 107
执行计划
---------------------------------------------------------- Plan hash value: 1696761856 ---------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 100 | 5500 | 4 (0)| 00:00:01 | | 1 | TABLE ACCESS SAMPLE| T001 | 100 | 5500 | 4 (0)| 00:00:01 | ---------------------------------------------------------------------------- SQL> select count(*) from t001 sample(20); COUNT(*) ---------- 97 ---------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 100 | 5500 | 4 (0)| 00:00:01 | | 1 | TABLE ACCESS SAMPLE| T001 | 100 | 5500 | 4 (0)| 00:00:01 | ----------------------------------------------------------------------------
可以看到,两次查询的结果并不一样,通过执行计划可以看出,ORACLE扫描了1/4左右的数据块,ORACLE也试图返回20%也就是100行的数据,但真正返回的结果并不十分准确。