這兩天發了一個貼子,尋找比較好的辦法隨機取出表的一條記錄
地址見:http://www.oracle.com.cn/viewthread.php?tid=20848
本文介紹了一下ORACLE SAMPLE文法的應用,採用SAMPLE也是一種解決方案,不過還不是很好,主要是返回的記錄分布不均勻,要麼是靠表前面的一些,要麼是不返回記錄。
下面是SAMPLE文法的使用樣本:
選擇10%的記錄
select * from t1 sample(10)
選擇0.1%的記錄
select * from t1 sample(0.1)
根據資料區塊選擇1%的記錄
select * from t1 sample block(1)
使用資料區塊選擇與使用記錄行選擇的區別:使用資料區塊選擇表示樣本的採集是基於資料區塊採集的,也就是說樣本如果一個資料區塊被採集為樣本,則資料區塊裡的記錄全部都是樣本
樣本統計是基於統計學採集的,是有機率問題,不一定完全準確,如你要取50%的記錄,但實際可能返回給你49%的記錄集,也可能返回給你51%的記錄集
例如
如果表T1有資料區塊B1,B2
B1有記錄R1,R2,R3,R4,R5
B2有記錄R6,R7,R8,R9,R10
如果使用如下SQL選擇50%的資料
select * from t1 sample block(50)
則返回的結果可能是資料區塊B1的記錄
R1,R2,R3,R4,R5
也可能是資料區塊B2的記錄
R6,R7,R8,R9,R10
也可能不返回記錄集
如果使用如下SQL選擇50%的資料
select * from t1 sample (50)
則返回的結果可能是
R2,R3,R5,R8,R9
也可能是如下的樣子
R1,R3,R4,R8
應用樣本:
隨機從表中取中1條記錄,選取記錄的機率是1%
select * from t1 sample(1) where rownum=1
隨機從表中取中10條記錄,選取記錄的機率是0.1%
select * from t1 sample(0.1) where rownum<=10
註:當選取的機率越低,訪問表的記錄數將越多
ORACLE參考手冊中的相關說明:
sample_clause
The sample_clause lets you instruct Oracle to select from a random sample of rows from the table, rather than from the entire table.
BLOCK
BLOCK instructs Oracle to perform random block sampling instead of random row sampling.
sample_percent
sample_percent is a number specifying the percentage of the total row or block count to be included in the sample. The value must be in the range .000001 to (but not including) 100.
Restrictions on Sampling During Queries
You can specify SAMPLE only in a query that selects from a single table. Joins are not supported. However, you can achieve the same results by using a CREATE TABLE ... AS SELECT query to materialize a sample of an underlying table and then rewrite the original query to refer to the newly created table sample. If you wish, you can write additional queries to materialize samples for other tables.
When you specify SAMPLE, Oracle automatically uses cost-based optimization. Rule-based optimization is not supported with this clause.
--------------------------------------------------------------------------------
Caution:
The use of statistically incorrect assumptions when using this feature can lead to incorrect or undesirable results.
--------------------------------------------------------------------------------
譯:
Sample選項
使用sample選項的意思是指定Oracle從表中隨機播放記錄樣本,這樣比從整個表中選擇更高效.
block選項
加上 BLOCK選項時表示隨機取資料區塊,而不是隨機取記錄行.
sample_percent選項
sample_percent是指定總記錄行或資料區塊為資料樣本的百分比數值,這個值只能在0.000001到100之間,且不能等於100
限制
只能在單表查詢的SQL中指定sample選項,不支援有串連的查詢。但是,你可以使用CREATE TABLE ... AS SELECT查詢的文法完成同樣的效果,然後再採用建立的樣本表重新編寫查詢SQL。
當你指定用sample時,不支援基於規則(rule)的最佳化法則,ORACLE自動使用基本成本(cost)的最佳化法則.
注意:
The use of statistically incorrect assumptions when using this feature can lead to incorrect or undesirable results.
這句話不太理解,估計是說採用樣本採集特性可能會產生不準確的結果集。