隨機讀取記錄

2021-09-05 19:44:54 字數 1386 閱讀 1347

方法一:

直接通過sql語句實現,如:

topn 

*from

tablea

order

bynewid()

這是最簡單的方法,通過呼叫sqlserver的newid()函式(產生guid—全域性唯一標誌符)來產生隨機記錄。

採用這種方法時,需要將表中所有記錄與newid()生成的值進行比較從而進行排序。因此,如果表中的記錄較多,操作會非常緩慢。

方法二:

假設表中有乙個自增長主鍵,增量為1。這時我們可以這樣處理,取出主鍵的邊界值(最大值和最小值),然後通過乙個演算法得到介於(包括)兩個邊界之間的隨機值,最後按照這個值取出對應記錄。下面是c#的例子:

//生成隨機數

random rand 

=new

random();

intnum 

=rand.next(minval,maxval +1

); //

minval為主鍵的最小值,maxval為主鍵的最大值

//讀取記錄的sql字串

string

sqlstr ="

select * from tablea where pk = "+

num;

這種方法較前一種方法的操作速度有了較大提高(特別是在大資料量的情況下)。但只有當主鍵值是連續的,中間沒有斷開的情況,並且增量為1時才能用這種方法。那麼,如何才能解決這個問題呢?請繼續往下看。

方法三:

對方法二進行了改進。主要思路是,將表中所有的主鍵值讀進乙個陣列,從陣列中隨機讀出乙個值,按照這個值取出對應記錄。下面是c#的例子:

//將主鍵值讀進arraylist

arraylist dataindex 

=new

arraylist();

while

(sdr.read()) 

//sdr為存放所有主鍵值的sqldatareader

//從arraylist中隨機讀取資料項

random rand 

=new

random();

intnum 

=convert.toint32(dataindex[rand.next(dataindex.length)]);

//讀取記錄的sql字串

string

sqlstr ="

select * from tablea where pk = "+

num;

這樣不管主鍵是否為自增長字段,也不管數值是否連續,都能夠應付自如了。經過筆者的測試,在資料量為50萬的情況下**執行速度幾乎沒有受到什麼影響,可見arraylist的操作效能是可以信賴的。

mysql隨機顯示記錄 MySQL隨機讀取表中記錄

order by rand 來實現 select from table order by rand 記憶體臨時表 order by rand 是一般通過記憶體臨時表排序,可以通過執行計畫explain中extra欄位顯示using temporary觀察到。由於是記憶體排序,回表過程不涉及機械磁碟i...

asp隨機讀取資料庫記錄

1 set rs server.createobject adodb.recordset rs.open select from news conn,1,1 if not rs.eof and rs.bof then rs.movefirst randomize 初始化乙個隨機數 i int rs....

資料庫中隨機讀取記錄的方法總結

1.sql server select top 10 from table order by newid 2.access select top 10 from table order by rnd id 其中id為自增1的字段 3.access asp randomize select top 1...