|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
RDBMS并非没有局限性。它们难以扩展,需要大量的资源来配置和维护,比如时间、硬件和人力。同样,它们往往遵循峰值性能模型,这就要求系统按照峰值容量来配置可用性,而不考虑典型的数据使用情况。比来在论坛看到有人问,怎样疾速天生100万不反复的8位编号,关于这个成绩,有几点是必要注重的:
1.怎样天生8位随机数,天生的数越随机,反复的大概性固然越小
2.把持不反复
3.思索功能
针对这个成绩,我写了以下的示例来办理,但愿能为有这类需求的人供应引导
天生100万条8位不反复数据的示例
USEtempdb
GO
--创立测试表
CREATETABLEtb(idchar(8))
--创立用于主动过滤反复值的独一索引
CREATEUNIQUEINDEXIX_tbONtb(id)
WITHIGNORE_DUP_KEY
GO
--测试数据拔出的处置工夫,纪录入手下手处置的工夫点
DECLARE@dtdatetime
SET@dt=GETDATE()
--拔出随机数据
SETNOCOUNTON
DECLARE@rowint
SET@row=1000000--设置总纪录数
WHILE@row>0
BEGIN
--显现提醒信息,暗示还必要拔出多行数据
RAISERROR(need%drows,10,1,@row)WITHNOWAIT
--拔出随机的位编码数据
SETROWCOUNT@row
INSERTtbSELECT
id=RIGHT(100000000+CONVERT(bigint,ABS(CHECKSUM(NEWID()))),8)
FROMsyscolumnsc1,syscolumnsc2
SET@row=@row-@@ROWCOUNT
END
--显现拔出数据利用的工夫
SELECTBeginDate=@dt,EndDate=GETDATE(),
Second=DATEDIFF(Second,@dt,GETDATE()),
GO
--显现终极的了局纪录是不是准确
SELECTCOUNT(*)FROMtb
GO
--删除测试
DROPTABLEtb
办理顶用到的技能:
1.把持发生的数据不反复,间接利用独一索引中的IGNORE_DUP_KEY选项,使拔出数据中的反复值主动过滤,制止手工处置反复
2.利用CHECKSUM共同NEWID()函数,使天生的数据只管随机,一样平常天生随机数会思索利用RAND()函数,但这个函数是发生伪随机值,用上面的语句测试一下,会发明发生的数据全体是一样的,这不合用于想批量天生多个随机数,而NEWID()函数天生的是GUID,基础上不会有反复的,再经由过程CHECKSUM将其转化成数字,如许发生反复的大概性会对照小
SELECTTOP10
RAND()
FROMsysobjects
3.在效力把持,利用轮回+批量天生的体例,而不是传统的逐一天生。在SQLServer中,每一个拔出语句城市有一个外部的事件处置,假如逐条拔出,则事件的开支太年夜,效力必将十分低;不思索一次性天生100万数据,一则由于天生的数据大概有反复的,往失落反复就没有100万了,二则一次性天生100万数据,损耗的内存和CPU资本也很高,一样平常的电脑大概接受不住.
列举选择MySQL的理由的最困难的地方在于,如何对这些理由进行排序。MySQL学习教程这就如同我们经常争论的故事:先有鸡还是先有蛋? |
|