以最快的方式生成大量的测试数据

USE tempdb
GO
IF OBJECT_ID('tempdb..#tmp') IS NOT NULL
	DROP TABLE #tmp
GO
CREATE TABLE #tmp(
	id bigINT IDENTITY(1,1) PRIMARY KEY,
	n  NVARCHAR(MAX)	
)
GO
SET NOCOUNT ON
DECLARE @i INT,@iMax INT
SET @iMax=10000000
WHILE 1=1 
BEGIN
	SELECT @i=COUNT(1) FROM #tmp
	PRINT @i
	IF @i>=@imax
	BEGIN
		BREAK;
	END
	IF @i=0
	BEGIN
		INSERT INTO #tmp (n) VALUES(N'xxxxxxxxxxxxxxx')	
	END
	IF @i<=@imax/2
	BEGIN
		INSERT INTO #tmp (n)
		SELECT n FROM #tmp
	END
	ELSE
	BEGIN
		INSERT INTO #tmp (n)
		SELECT TOP( @iMax-@i ) n FROM #tmp
	END
END
-- 1000 万数据也就 2 分 13 秒
-- insert into #tmp(n) values('xxxx') GO 10000000 这种方式虽然写法简单,但相当于循环一条条地插,效率不高。


——————————————————————————— 分割线 ——————————————————————————

另外也可以用 cte 来做, 虽然慢一点, 但胜在写法简单吧:

下面是两种写法实现同样功能的对比:

循环:28秒

IF OBJECT_ID('tmp') IS NOT NULL DROP TABLE tmp
GO
CREATE TABLE tmp(id bigINT NOT NULL PRIMARY KEY)
GO
SET NOCOUNT ON
DECLARE @i INT,@iMax INT
SET @iMax=10000000
INSERT INTO tmp (id) VALUES(1)
WHILE 1=1 
BEGIN
    SELECT @i=MAX(id) FROM tmp
    IF @i<=@imax/2
    BEGIN
        INSERT INTO tmp (id)
        SELECT @i+id FROM tmp ORDER BY id
    END
    ELSE
    BEGIN
        INSERT INTO tmp (id)
        SELECT TOP( @iMax-@i ) @i+id FROM tmp ORDER BY id
        BREAK;
    END
END


cte: 2分25秒

IF OBJECT_ID('dbo.spt_values') IS NOT NULL
	DROP TABLE dbo.spt_values
GO
CREATE TABLE dbo.spt_values(
	id INT NOT NULL PRIMARY KEY	
)
GO
;WITH Seq(id)  AS (
    SELECT 1
    UNION ALL 
    SELECT id + 1
	FROM   seq
	WHERE  id < 10000000
) 
INSERT INTO dbo.spt_values(id)
SELECT * FROM Seq AS s 
OPTION(MAXRECURSION 0)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值