Oracle中隨機抽取N條記錄

2021-08-20 20:15:01 字數 3368 閱讀 9200

一、oracle訪問資料的基本方法:

1)、全表掃瞄(full table scan):執行全表掃瞄,oracle讀表中的所有記錄,考查每一行是否滿足where條

件。oracle順序的讀分配給該錶的每乙個資料塊,且每個資料塊oracle唯讀一次.這樣全表掃瞄能夠受益於

多塊讀。

2)、取樣表掃瞄(sample table scan):掃瞄返回表中隨機取樣資料,這種訪問方式需要在from語句中包含

sample選項或者sample block選項。

二、獲取隨機結果集的方法:

1)、使用sample獲取隨機結果集

1、語法: sample [ block ](sample_percent)[ seed (seed_value) ]

sample選項:表示按行取樣來執行乙個全表掃瞄,oracle從表中讀取特定百分比的記錄,並判斷是否滿足

where子句以返回結果。

block: 表示使用隨機塊例舉而不是隨機行例舉。

sample_percent:是隨機獲取一張表中記錄的百分比。比如值為10,那就是表中的隨機的百分之10的記 

錄。值必須大於等於.000001,小於100。

seed:表示從哪條記錄返回,類似於預先設定例舉結果,因而每次返回的結果都是固定的。該值必須介於0

和4294967295之間。

2、例子(看語法不如看例子)

--從表 zs_xj_family 中「全表掃瞄」隨機抽取20%的記錄,再從中隨機查詢5條記錄

select   *

from   zs_xj_family sample (20)

where   rownum <= 5;

-- 從表 zs_xj_family 中「取樣表掃瞄」隨機抽取10%的記錄,再從中隨機查詢5條記錄

select   *

from   zs_xj_family sample block (10)

where   rownum <= 5;

--使用seed,返回固定的結果集。

select   *

from   zs_xj_family sample (10) seed (3)

where   rownum <= 5

select   *

from   zs_xj_family sample block (10) seed (11)

where   rownum <= 5;

注意: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))

2)使用dbms_random包

dbms_random有兩種主要的使用方法分別是:dbms_random.value()和dbms_random.random

1、獲取乙個隨機數

--(0-10的整數)

select   trunc (dbms_random.value (0, 10)) randomnum from dual;

--(0-100的浮點數)

select   dbms_random.value (0, 100) randomnum from dual;

--(0.幾的小數)

select   dbms_random.value () randomnum from dual;

2、獲取隨機記錄

select   *

from   (  select   *

from   zs_family

where is_test=1

order by   dbms_random.value)

where   rownum <= 3

select   *

from   (  select   *

from   zs_family

where is_test=1

order by   dbms_random.value(1,3))

where   rownum <= 3

select   *

from   (  select   *

from   zs_family

where   is_dxx = 1 and is_test = 1

order by   dbms_random.random)

where   rownum <= 3

3)使用內部函式sys_guid()

select   *

from   (  select   *

from   zs_family

where   is_test = 1

order by   sys_guid())

where   rownum <= 3

注意:在使用sys_guid() 這種方法時,有時會獲取到相同的記錄,即和前一次查詢的結果集是一樣的,查詢相

關資料,有些說是和作業系統有關,在windows平台下正常,獲取到的資料是隨機的,而在linux等平台下始

終是相同不變的資料集,有些說是因為sys_guid()函式本身的問題,即sys_guid()會在查詢上生成乙個 16

位元組的全域性唯一識別符號,這個識別符號在絕大部分平台上由乙個宿主識別符號和程序或程序的執行緒識別符號組成,

這就是說,它很可能是隨機的,但是並不表示一定是百分之百的這樣。

所以,為確保在不同的平台每次讀取的資料都是隨機的,我們大多採用使用sample函式或者 dbms_random

包獲得隨機結果集,其中使用sample函式更常用,因為其查詢時縮小了查詢範圍,在查詢大表,且要提取數

據不是很不多的情況下,會對查詢速度上有明顯的提高。

三、其他資料庫隨機取出n條記錄:

1、sqlserver中隨機提取資料庫記錄

select * from 表 order by newid()

2、mysql中隨機提取資料庫記錄

select * from tablename order by rand() limit 10

3、access中隨機提取資料庫記錄

select top 10 * from tablename order by rnd(欄位名)

Oracle中隨機抽取N條記錄

一 oracle訪問資料的基本方法 1 全表掃瞄 full table scan 執行全表掃瞄,oracle讀表中的所有記錄,考查每一行是否滿足where條 件。oracle順序的讀分配給該錶的每乙個資料塊,且每個資料塊oracle唯讀一次.這樣全表掃瞄能夠受益於 多塊讀。2 取樣表掃瞄 sampl...

oracle隨機查詢n條記錄

從table name表中隨機查詢3條記錄,如下 select from select from table name where 條件 order by trunc dbms random.value 1,7 temp where rownum 3 附 一 oracle trunc 函式的用法 t...

隨機抽取n個記錄的SQL

隨機抽取n個記錄的sql mysql和sqlserver mysql select from tablename order by rand limit 10 sqlserver select top 10 from tablename order by newid 在符合條件的資料中的,從第5條開...