如何快速生成100万不重复的8位编号

最近在论坛看到有人问,如何快速生成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
 
    -- 插入随机的位编码数据
    SET ROWCOUNT @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资源也很高,一般的电脑可能承受不住.

时间: 2024-10-31 10:43:12

如何快速生成100万不重复的8位编号的相关文章

快速生成100万不重复的8位编号

重复 最近在论坛看到有人问,如何快速生成100万不重复的8位编号,对于这个问题,有几点是需要注意的: 1.    如何生成8位随机数,生成的数越随机,重复的可能性当然越小 2.    控制不重复 3.    考虑性能 针对这个问题,我写了如下的示例来解决,希望能为有这类需求的人提供指导   生成100万条8位不重复数据的示例 USE tempdb GO   -- 创建测试表 CREATE TABLE tb(id char(8))   -- 创建用于自动过滤重复值的唯一索引 CREATE UNIQ

支付宝放大招 钻石会员免费提现额度达100万 | 附快速升级攻略

6月5号,蚂蚁金服宣布会员体系升级,其中最引人关注的是,钻石会员将享有当日余额宝快速转出额度20万元,以及免费提现100万元的特权. 而对于蚂蚁森林用户来说,最值得期待的是,钻石会员将会拥有"蚂蚁森林能量保护罩"特权,一旦开启,在规定的天数内,你的朋友起得再早也没法"偷走"你的能量了. 蚂蚁会员负责人徐笛介绍说,蚂蚁会员的升级是应会员的实际要求而定,不想提供毫无用处的摆设,而是给会员提供更实用的定制权益. 徐笛透露,很多钻石会员有着强烈的提现要求,因为余额宝每天每人

TCPDF 5.9.100发布 快速生成PDF文件的PHP5函数包

TCPDF是一个用于快速生成PDF文件的PHP5函数包.TCPDF基于FPDF进行扩展和改进.支持UTF-8,Unicode,HTML和XHTML. TCPDF支持所有ISO页面格式和自定义页面格式,自定义边距和度量单位,UTF-8 Unicode,RTL语言,HTML,条形码,TrueTypeUnicode,TrueType,OpenType,Type1和CID-0字体,图像,图形功能,裁剪,书签,http://www.aliyun.com/zixun/aggregation/33906.ht

草根站长如何快速挣到人生第一个100万

中介交易 SEO诊断 淘宝客 云主机 技术大厅 每个做网络的人其实都有过想暴富的心态,包括我自己当时想做网络就是因为受到朋友和网上一些大神们的影响.看到别人几千几百万的赚真的是太吸引了.说实话,大部分人都是因为这样的心态开始做网络的.当然也有一些是因为兴趣爱好,或者想搞点兼职帮补开支的.但是基本90%的站长都做过创富梦. 特别是我们看多了马云,史玉柱,李彦宏,马化腾等他们被吹嘘得像神一样的故事之后.更是热血沸腾.不过能成为这样的大神可能只有亿分之一的机会,对于我们基本上是不可能的.所以梦不能做得

如何用Go语言每分钟处理100万个请求

摘要:作者结合自身工作经历,以一个项目为案例,通过多个Go语言程序实例的尝试,阐述了Go语言是如何每分钟可以处理100万个请求的,以下是译文. 我在几个不同的公司从事反垃圾邮件,反病毒和反恶意软件工作超过15年,现在我知道这些系统的复杂性可能是由于我们每天处理的大量数据造成的. 目前,我是 smsjunk.com 的CEO和 KnowBe4 的首席架构师,两个活跃在网络安全行业的公司. 有趣的是,在过去10年左右的时间里,作为一名软件工程师,我所参与的所有web后端开发大部分都是以Ruby on

代码生成工具之界面快速生成

界面开发,无论对于Web开发,还是Winform开发,都需要耗费一定的时间,特别对于一个数据库字段比较多的界面,一般就需要在编辑界面上摆的更多的控件来做数据显示,每次碰到这个,都有点头痛,反复的机械操作让人挺累,也很烦,但是又必须这样做. 由于数据库字段和界面的排版都有一定的关联关系,因此可以通过代码生成工具Database2Sharp的数据库元数据,包含表名称.备注信息.字段列表,以及每个字段的名称.备注.类型等信息,构造一个基础的界面,把重复机械的部分给快速完成,这就是我所说的界面快速生成.

Erebus以Linux勒索软件的方式重出江湖,勒索韩国公司100万美元

本文讲的是Erebus以Linux勒索软件的方式重出江湖,勒索韩国公司100万美元, 6月10日,韩国网络托管公司NAYANA被Erebus 勒索软件(由趋势科技公司检测为RANSOM_ELFEREBUS.A)攻击,导致旗下 153 台 Linux 服务器与 3400 个商业网站感染 Erebus 勒索软件. 安全专家表示,勒索软件 Erebus 滥用 Event Viewer 提权,允许实现用户账户控制( UAC )绕过,即用户不会收到以较高权限运行程序运行的通知.此外, Erebus 还可将

用PHP 快速生成 Flash 动画的方法_php基础

使用 Ming 库动态构建 Flash 动画 Rich Internet Application 是 Web 2.0 中的新时髦词,并且就 Web 2.0 的实质而言,一个关键组件就是 Adobe Flash.了解如何将 Flash 动画集成到应用程序中,并使用 Ming 库动态生成 Flash 动画. Web 2.0 引入了 Rich Internet Application.但 Rich Internet Application 的含义是什么?通常,它意味着向应用程序中添加具有高度响应能力的

Badoo 告诉你切换到 PHP7 节省了 100 万美元

介绍 我们成功的把我们的应用迁移到了php7上面(数百台机器的集群),而且运行的很好,据说我们是第二个把如此规模的应用切换到php7的企业,在切 换的过程我们发现了一些php7字节码缓存的bug,庆幸的是这些bug现在已经被修复了,现在我们把这个激动人心的消息分享给所有的php社 区:php7现在已经可以稳定的运行在商用环境上,而且比以前更加节省内存,性能也有的很大的提高. 下面我会详细的介绍下我们是如何把应用前移动php7的,我们在这中间遇到的问题及处理情况,还有最终的结果.但首先让我们回头看