大量資料插入的幾種方式的速度比較
》裡,有一列資料是用
rank
函式來生產的,用來造假資料。
現在的問題是,如果要更新這一列的值,怎麼辦呢?也許全部刪除,重新插入一遍就可以。但是太慢了。於是隨手就寫出了下面的**。
update
atable set acolumn = @maxint *
rand
()
結果完全出乎意料,這一列的值全是一樣的!
好吧,可以要給
rand()
乙個種子。就隨手把
id列的值傳給了
rand
函式。
update
atable set acolumn = @maxint *
rand
(id)
結果id相近的
rand
值也很接近,如下所示。
1 1532427136
2 1532467150
3 1532507164
4 1532547178
5 1532587192
6 1532627206
7 1532667220
8 1532707234
9 1532747248
10 1532787262
不會吧,
rand
函式居然可以這麼線性啊。
~~~~~~~~
基本上可以計算出id=
11時,
rank
函式的值了。還好每次執行的結果是不一樣。
那就給rand
函式傳乙個非線性的值嘍。第一感覺就是用個異或運算,和誰異或呢?第一感覺就是和時間。
於是有了下面的**。
update
atable set acolumn =
convert
(int
,rand
((datediff
(ms,
'2009-08-28 23:13:00'
,getdate
()))
^ id)
* @maxint)
下面是執行結果。
1 1194104621
2 1194224663
3 1194184649
4 1194304691
5 1194264677
6 1194384719
7 1194344705
8 1194464748
9 1194424733
10 1194544776
還好,不是線性的了,不過這個值也還是在個小範圍裡轉悠。
本想把seed
搞得再亂點,不過一想,如果能不用
rand
函式,搞出個足夠亂的
seed
來,還要
rand
函式幹什麼呢?難道把乙個線性的輸入變成非線性的輸出不就應該是
seed
函式來做的嗎?
無奈之餘,最後曲線救國的一招了。基本假設
acolumn
列已經是足夠
random
了。所以更新這一列,這樣就可以了。
update
atable set acolumn = @maxint *
rand
(acolumn)
還是可以在
insert
資料時用
rand
保證acolumn
的隨機性的。
有什麼辦法可以不需要給
rand
傳乙個隨機的
seed
就能讓rand
一定返回乙個隨機數嗎?
rand 函式的使用
使用 執行結果說明隨機函式的使用 隨機數生成的原理 計算機產生的隨機數一般都只是乙個週期很長的數列,不是真的隨機數。也就是說,隨機數一般是偽隨機數,每個隨機數都是由隨機種子開始的乙個已定的數列 週期很長 一般地,為了隨機數更真一點,隨機種子在系統中通常是參照系統時鐘生成的。以上引用了別人的話。有幾個...
rand 函式使用
一般情況下,我們在生成隨機數的時候,都會用srand來獲取種子,再使用rand 函式生成隨機數。include include void main 結果確並不是跟設想的一樣產生隨機數 root localhost test a.out i 0,r 6 i 1,r 6 i 2,r 6 i 3,r 6 ...
C語言使用rand函式生成隨機數
目錄 生成隨機數使用rand 函式 int rand void 標頭檔案目前該 隨機數 貌似成功生成 大家有木有發現其實這三次的執行結果生成的隨機數其實是一樣的,沒錯,我說的就是三次,第一次是程式設計客棧41 18467 6334 26500 19169 15724 11478 29358 2696...