当前位置: 首页 > Oracle, oracle 10g, oracle 11g > 正文

利用SAMPLE随机取数据

目前负责的这个数字化项目,需要开发个质检工具,实现每次随机取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行的数据,但真正返回的结果并不十分准确。

本文固定链接: http://www.dbdream.com.cn/2011/10/%e5%88%a9%e7%94%a8sample%e9%9a%8f%e6%9c%ba%e5%8f%96%e6%95%b0%e6%8d%ae/ | 信春哥,系统稳,闭眼上线不回滚!

该日志由 dbdream 于2011年10月23日发表在 Oracle, oracle 10g, oracle 11g 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 利用SAMPLE随机取数据 | 信春哥,系统稳,闭眼上线不回滚!
关键字:

利用SAMPLE随机取数据:等您坐沙发呢!

发表评论

快捷键:Ctrl+Enter