使用DBMS_RANDOM包来排序记录,然后使用一个行限制子句限制到期望的样本大小
dbms_random.value函数为表中的所有行获取介于0和1之间的随机数,并按随机值的升序排序。
这里是如何产生的,你确定的样本集:
SELECT
*
FROM
(
SELECT
*
FROM
tbl1
ORDER BY dbms_random.value
)
FETCH FIRST 1000000 ROWS ONLY;
与样品架构表,emp
演示,我们品尝4个记录:
[email protected]> SELECT
2 empno,
3 rnd_val
4 FROM
5 (
6 SELECT
7 empno,
8 dbms_random.value rnd_val
9 FROM
10 emp
11 ORDER BY rnd_val
12 )
13 FETCH FIRST 4 ROWS ONLY;
EMPNO RND_VAL
7698 0.06857749035643605682648168347885993709
7934 0.07529612360785920635181751566833986766
7902 0.13618520865865754766175030040204331697
7654 0.14056380246495282237607922497308953768
[email protected]> SELECT
2 empno,
3 rnd_val
4 FROM
5 (
6 SELECT
7 empno,
8 dbms_random.value rnd_val
9 FROM
10 emp
11 ORDER BY rnd_val
12 )
13 FETCH FIRST 4 ROWS ONLY;
EMPNO RND_VAL
7839 0.00430658806761508024693197916281775492
7499 0.02188116061148367312927392115186317884
7782 0.10606515700372416131060633064729870016
7788 0.27865276349549877512032787966777990909
通过上面的例子中,通知在执行SQL * Plus命令期间empno
发生显着变化。
与行数你所描述的性能可能是一个问题。
编辑:
随着在150场演出的顺序表的大小 - 79 MM,任何排序将是痛苦的。
如果表有基于加1序列的代理键,我们可以采取选择基于密钥的每个第n个记录的方法。
例如
--scenario n = 3000
FROM
tbl1
WHERE
mod(table_id, 3000) = 0;
这一做法将不会使用索引(除非创建函数的索引),但至少我们没有这种规模的数据集进行排序。
我有接近80万条记录的表进行解释计划,它并执行全表扫描(条件势力这个没有功能的索引),但是这看起来站不住脚的。
Oracle提供一些可靠的工具来进行采样。你看过示例sql子句(https://blogs.oracle.com/datamining/to-sample-or-not-to-sample-part-2)。 –
顺便说一句,你的问题是非常类似于这个问题,https:// stackoverflow。com/questions/9868409/how-to-get-records-randomly-from-the-oracle-database –
你需要一百万行还是大约一百万行? – APC