使用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