我在SQL Server 2014中运行了SQL语句 . 我有3列:id,text1,text2在text1中插入记录,text2 text1是nvarchar text2是varchar到目前为止在大约3.5小时内插入120万行试图插入300万需要帮助减少插入时间
码:
DECLARE @i as int
SET @i = 0
WHILE @i < 3000000
BEGIN
SET @i = @i + 1
insert into test (text1 , text2)
values(N'你好','VJ'+ cast(@i as varchar(20)))
END
3 回答
这是另一种方法...它完成得非常快......在我的SQL服务器上不到5秒
你可以这样试试
您可以在CTE中使用其他逻辑,只需将结果集插入实际表中即可 . 这里的insert语句在循环之外(1个插入语句有3000000条记录),因此它比在循环中插入3000000次(3000000个插入语句,每个记录1条记录)更快
默认情况下,MAXRECURSION为100以避免无限循环,在这里你需要覆盖它(但这不是一个好习惯) .
不使用递归CTE的替代方法是使用具有足够记录的已知表,以便您可以对其进行迭代:
sys.messages
是一个非常大的表(至少200K
条记录),所以它可以安全地用于100K
批次 .时间使用
recursive CTE
:51s使用上述解决方案的时间:28秒
(在
SQL Server 2014 Express
实例上测试,仅SELECT
)