六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 317|回复: 0

ORACLE随机取数据

[复制链接]

升级  37.33%

26

主题

26

主题

26

主题

秀才

Rank: 2

积分
106
 楼主| 发表于 2013-1-29 15:28:32 | 显示全部楼层 |阅读模式
目前负责的这个数字化项目,需要开发个质检工具,实现每次随机取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 |
---------------------------------------------------------------------------
 但是SAMPLE返回的结果并不是十分的准确,通过执行计划可以看出,ORACLE试图返回正确的20%在这里也就是100行记录。
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 |
---------------------------------------------------------------------------
        可以通过以下方式查询是否取的是随机数据。
SQL> select efile from t001 sample(20) where rownum<6;
EFILE
-------------------------------------------------------
D:\03\03--0017\04-01-03-0017-003-0004.jpg;
D:\03\03--0046\04-01-03-0046-002-0004.jpg;
D:\03\03--0056\04-01-03-0056-002-0001.jpg;
D:\05\05--0023\04-01-05-0023-011-0002.jpg;
D:\03\03--0120\04-01-03-0120-006-0001.jpg;
SQL> select efile from t001 sample(20) where rownum<6;
EFILE
-------------------------------------------------------
D:\02\02--0149\04-01-02-0149-003-0008.jpg;
D:\03\03--0017\04-01-03-0017-003-0001.jpg;
D:\03\03--0017\04-01-03-0017-003-0002.jpg;
D:\03\03--0017\04-01-03-0017-003-0004.jpg;
D:\03\03--0017\04-01-03-0017-003-0008.jpg;
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表