oracle 隨機取數據

轉載自:http://blog.sina.com.cn/s/blog_876aa98d0100xjn1.html


---------------------------隨機取一條數據------------------------------------------
select message_name from (select rownum rr,message.* frommessage)
where rr= (select trunc(dbms_random.value(1,(select count(*) frommessage)+1)) from dual)
------------------隨機排序然後取一條數據-------------------------------------------------------
select a.*,rownum from(select m.* from message m order bydbms_random.random)a where rownum=1


以下內容轉載自:http://yisean.iteye.com/blog/608581

oracle 中隨機取數據的方法:

1.快速隨機取數據(推薦使用):

select * from MEMBER sample(1) where rownum <= 10

2.隨機取數據,較慢

select * from (
select * from MEMBER order by dbms_random.value
) where rownum<=10

========原文========

最近在做系統時用到了隨機抽取記錄的問題;

上網上查找了很多相關資料,發現了不同的方法及其差異。都是基於ORACLE的方法哦

首先第一個是隨機抽取6個

select * from (select * from tablename order by order by dbms_random.value) where rownum<7

這個方法的原理我認爲應該是把表中的數據全部查詢出來按照隨機數進行排列後在從查詢出來的數據中查詢中6條記錄,這個方法我在使用的過程中發現,如果記錄一多的話查詢的速度有一點點的慢,測試時是7000條,如果幾萬幾十萬的話可能就更慢了;

第二個是利用oracle的sample()或sample block方法

select * from tablename sample ( 50 ) where rownum<6

這個稍稍介紹一下sample

Oracle訪問數據的基本方法有:
1.全表掃描
2.採樣表掃描

全表掃描(Full table Scan)
全表掃描返回表中所有的記錄。
執行全表掃描,Oracle讀表中的所有記錄,考查每一行是否滿足WHERE條件。Oracle順序的讀分配給該表的每一個數據塊,這樣全表掃描能夠受益於多塊讀.
每個數據塊Oracle只讀一次.

採樣表掃描(sample table scan)
採樣表掃描返回表中隨機採樣數據。
這種訪問方式需要在FROM語句中包含SAMPLE選項或者SAMPLE BLOCK選項.

SAMPLE選項:
當按行採樣來執行一個採樣表掃描時,Oracle從表中讀取特定百分比的記錄,並判斷是否滿足WHERE子句以返回結果。

SAMPLE BLOCK選項:
使用此選項時,Oracle讀取特定百分比的BLOCK,考查結果集是否滿足WHERE條件以返回滿足條件的紀錄.

Sample_Percent:
Sample_Percent是一個數字,定義結果集中包含記錄佔總記錄數量的百分比。
Sample值應該在[0.000001,99.999999]之間。

主要注意以下幾點:

1.sample只對單表生效,不能用於表連接和遠程表
2.sample會使SQL自動使用CBO


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章