最近在作系統時用到了隨機抽取記錄的問題; sql
上網上查找了不少相關資料,發現了不一樣的方法及其差別。都是基於ORACLE的方法哦 oracle
首先第一個是隨機抽取6個 dom
select * from (select * from tablename order by order by dbms_random.value) where rownum<7 測試
這個方法的原理我認爲應該是把表中的數據所有查詢出來按照隨機數進行排列後在從查詢出來的數據中查詢中6條記錄,這個方法我在使用的過程當中發現,若是記錄一多的話查詢的速度有一點點的慢,測試時是7000條,若是幾萬幾十萬的話可能就更慢了; table
第二個是利用oracle的sample()或sample block方法 原理
select * from tablename sample ( 50 ) where rownum<6 隨機數
這個稍稍介紹一下sample select
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
見解
我在測試sample的時候發現若是個人表中數據有20條,按照它的sample值我寫這樣的sql: select * from tablename sample(50) 應該結果集中的數據佔總數據的50%纔對,可是屢次執行以後的結果倒是多少數據都有,小於50%、大於50%的都有,這跟 Sample_Percent是一個數字,定義結果集中包含記錄佔總記錄數量的百分比 的說明不符,並且用sample block時有時候還能查詢出空結果集(select * from tablename sample block(50)) ,不知道是否是我對這個理解不夠仍是。。。,反正感受很疑惑;