oracle隨機讀取表中的N條資料方法:
1) select * from (select * from tablename order by sys_guid()) where rownum 2) select * from (select * from tablename order by dbms_random.value) where rownum3) select * from (select * from table_name sample( 10) order by trunc(dbms_random.value(0, 1000))) where rownum 說明:
sample(10)意義為檢索表中的10%數據,sample值應該在[0.000001,99.999999]之間,其中 sys_guid() 和 dbms_random.value都是內部函數
註:
在使用sys_guid()方法時,有時會取得相同的記錄,也就是和前一次查詢的結果集是一樣的。這種情況可能與作業系統有關,例如Windows系統下正常,在Linux系統下異常。另外,sys_guid()函數本身可能有問題,需要進一步研究。
為確保在不同平台讀取的資料都是隨機的,建議採用2)和3)兩種方案。其中2)方案較常用,3)方案則適用於查詢大表且提取資料不多的情況下,能提高查詢速度。
oracle隨機讀取表中的N條資料方法:
1
2
3
1) select * from (select * from tablename order by sys_guid()) where rownum 2) select * from (select * from tablename order by dbms_random.value) where rownum3) select * from (select * from table_name sample( 10) order by trunc(dbms_random.value(0, 1000))) 其中 rownum
說明:
sample(10)意義為檢索表中的10%數據,sample值應該在[0.000001,99.999999]之間,其中 sys_guid() 和 dbms_random.value都是內部函數
註:
在使用sys_guid()方法時,有時會取得相同的記錄,也就是和前一次查詢的結果集是一樣的。這種情況可能與作業系統有關,例如Windows系統下正常,在Linux系統下異常。另外,sys_guid()函數本身可能有問題,需要進一步研究。
為確保在不同平台讀取的資料都是隨機的,建議採用2)和3)兩種方案。其中2)方案較常用,3)方案則適用於查詢大表且提取資料不多的情況下,能提高查詢速度。
這幾天工作上的需要,要從一個比較大的表中隨機取出一條記錄,oracle 不像MS SQLSERVER那樣,直接用Select TOP 1 * From TABLE Order By NewID(),就能高效的隨機查出一筆記錄。經過一翻折騰,用一個有90萬筆記錄的表t_id,只有一個gameid字段,該字段上沒有索引,表裡就是從100000到999999一連串的數據記錄,進行測試:
方法1.
採用rownum和dbms_random.value,平均用時5秒,這個效率確實是太低了,對於小表應該還行,大表那就太不適合了。
declare
n_id number(6);
begin
SELECT gameid into n_id FROM(SELECT gameid FROM t_id T ORDER BY dbms_random.value()) WHERE ROWNUM=1;
dbms_output.put_line(to_char(n_id));
end;
/
方法2.
採用oracle sample語法,設定隨機樣本是1%,結果用時0.01左右,速度是相當快的,但是根據官網的說法,採用sample採集特性可能會產生不准確的結果集,我在測試中是沒有碰到不正確的結果。但有個問題,就是隨機的結果分佈很不平均,結果幾乎都分內存卡在100000-200000的記錄中。效率雖好,但並沒有達到很好的隨機效果,如果對於結果的要不是很高的,這個方法是相當不錯的。
declare
n_id number(6);
begin
SELECT gameid into n_id FROM t_id SAMPLE (1) WHERE ROWNUM = 1;
dbms_output.put_line(to_char(n_id));
end;
/
方法3.
採用minus語法,先隨機取得一個在表總記錄數範圍內的一個隨機數,再透過rownum查詢兩個結果集只相差一條記錄,用minus相減留出事先隨機數的那筆記錄,平均用時大概1秒,隨機數越小,查詢速度越快,隨機數是20000時,用於0.016秒。該方法雖然
能得到很有隨機效果,但效率比較不上該方法2. 對效率要一般的話, 還是可以考慮使用的。
declare
n_count int:=0;
n_rand_num int:=0;
n_id number(6);
begin
SELECT COUNT(*) INTO n_count FROM t_id;
SELECT trunc(dbms_random.value(1,n_count 1)) INTO n_rand_num FROM DUAL;
select gameid into n_id from (SELECT gameid FROM t_id T WHERE rownum minus SELECT gameid FROM t_id T WHERE rownum dbms_output.put_line(to_char(n_id)); end; /
以上是如何隨機選擇一筆記錄從一個表格中的詳細內容。更多資訊請關注PHP中文網其他相關文章!