欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ORACLE随机取数据

程序员文章站 2022-07-15 14:43:58
...

目前负责的这个数字化项目,需要开发个质检工具,实现每次随机取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;