目前负责的这个数字化项目,需要开发个质检工具,实现每次随机取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;
ORACLE随机取数据
最新推荐文章于 2023-07-18 10:54:12 发布