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
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 --select ... FROM syscolumns c1, syscolumns c2的行数会超过100W,这里只取100W
INSERT Testtb(code) SELECT ---一次性的插入100W条记录,如果有重复的记录,那需要第二次执行插入,以此类推,一直到插入100W条为止。
id = 'ABCD' + RIGHT(100000000 + CONVERT(bigint, ABS(CHECKSUM(NEWID()))), 8)--100000000用来确保生成的随机数字有8位长度,
FROM syscolumns c1, syscolumns c2 --这里使用syscolumns只是为了获得大于100W的记录而已。至于随机的来源是个这个表是没有关系的。
SET @row = @row - @@ROWCOUNT --根据影响的行数,设置循环的时候需要插入的记录数量,这个记录数量等于本次操作中重复的记录的行数。
END
SELECT BeginDate = @dt, EndDate = GETDATE(), Second = DATEDIFF(Second, @dt, GETDATE())
GO
SELECT COUNT(*) FROM Testtb
GO
/*我的问题是
(1)为什么使用CHECKSUM()来生成随机数字?
(2)NEWID是生成一个唯一标志,既然它是唯一性的,怎么会又有重复的呢?
(3)http://msdn2.microsoft.com/zh-cn/library/ms189788.aspx
返回按照表的某一行或一组表达式计算出来的校验和值。CHECKSUM 用于生成哈希索引。
哈希表索引是数字型的吗?
*/
RAISERROR('need %d rows', 10, 1, @row) WITH NOWAIT --有重复行发生的时候把信息输出到客户端
-- 这个是直接给提示信息, 有重复时的提示信息是sql自动抛出的
INSERT Testtb(code) SELECT ---一次性的插入100W条记录,如果有重复的记录,那需要第二次执行插入,以此类推,一直到插入100W条为止。
-- 有重复的数据的时候, 重复的数据会自动过滤掉
CHECKSUM
返回在表的行上或在表达式列表上计算的校验值。CHECKSUM 用于生成哈希索引。
语法
CHECKSUM ( * | expression [ ,...n ] )
参数
*
指定在表的所有列上进行计算。如果有任一列是非可比数据类型,则 CHECKSUM 返回错误。不可比数据类型是 text、ntext、image、cursor 以及基本类型为前 4 个数据类型之一的 sql_variant。
expression
是除非可比数据类型之外的任何类型的表达式。
返回类型
int
000