最近在論壇看到有人問,如何快速生成
100萬不重複的
8位編號,對於這個問題,有幾點是需要注意的:
1.如何生成
8位隨機數,生成的數越隨機,重複的可能性當然越小
2.控制不重複
3.考慮效能
針對這個問題,我寫了如下的示例來解決,希望能為有這類需求的人提供指導 生成
100萬條
8位不重複資料的示例
use
tempdb
go
--
建立測試表
create
table tb(id char
(8))
--
建立用於自動過濾重複值的唯一索引
create
unique
index ix_tb on tb(id)
with
ignore_dup_key
go
--
測試資料插入的處理時間
, 記錄開始處理的時間點
declare
@dt datetime
set@dt =
getdate
()
--
插入隨機資料
set
nocount
on
declare
@row int
set@row = 1000000
-- 設定總記錄數
while
@row >0
begin
--
顯示提示資訊
, 表示還需要插入多行資料
raiserror
('need %d rows'
, 10, 1, @row)
with nowait
--
插入隨機的位編碼資料
setrowcount @row
insert tb select
id =
right(100000000 +
convert
(bigint
,abs
(checksum
(newid
()))), 8)
from syscolumns c1, syscolumns c2
set @row = @row -
@@rowcount
end
--
顯示插入資料使用的時間
select
begindate = @dt, enddate =
getdate
(),second =
datediff
(second, @dt,
getdate
()),
go
--
顯示最終的結果記錄是否正確
select
count
(*)from tb
go
--
刪除測試
drop
table tb
解決中用到的技巧: 1.
控制產生的資料不重複,直接使用唯一索引中的
ignore_dup_key
選項,使插入資料中的重複值自動過濾,避免手工處理重複
2.
使用checksum
配合newid()
函式,使生成的資料盡量隨機,一般生成隨機數會考慮使用
rand()
函式,但這個函式是產生偽隨機值,用下面的語句測試一下,會發現產生的資料全部是一樣的,這不適用於想批量生成多個隨機數,而
newid()
函式生成的是
guid
,基本上不會有重複的,再通過
checksum
將其轉化成數字,這樣產生重複的可能性會比較小
select
top 10
rand
()
from
sysobjects
3.
在效率控制,使用迴圈
+批量生成的方式,而不是傳統的逐個生成。在
sql server
中,每個插入語句都會有乙個內部的事務處理,如果逐條插入,則事務的開銷太大,效率勢必非常低;不考慮一次性生成
100萬資料,一則因為生成的資料可能有重複的,去掉重複就沒有
100萬了,二則一次性生成
100萬資料,消耗的記憶體和
cpu資源也很高,一般的電腦可能承受不住
如何快速生成100萬不重複的8位編號?
這個問題鄒建給出了乙個方法 http blog.csdn.net zjcxc archive 2006 08 20 1099215.aspx 我給出另外乙個方法。假設我要在10000000 99999999之間產生100萬個不重複的隨機數。可以建立乙個表table1,這個表有兩個字段,乙個是所產生的...
如何快速生成100萬不重複的8位編號
最近在論壇看到有人問,如何快速生成100萬不重複的8位編號,對於這個問題,有幾點是需要注意的 1 如何生成8位隨機數,生成的數越隨機,重複的可能性當然越小 2 控制不重複 3 考慮效能 針對這個問題,我寫了如下的示例來解決,希望能為有這類需求的人提供指導 生成100萬條8位不重複資料的示例 use ...
如何快速生成100萬不重複的8位隨機編號?
假設我要在10000000 99999999之間產生100萬個不重複的隨機數。可以建立乙個表table1,這個表有兩個字段,乙個是所產生的隨機數字段 int型 另外乙個也是int型字段。使用99999999 10000000 89999999 整除 1000000 89 捨去 然後從10000000...