我最近继承了这个SQL:
TRUNCATE TABLE [tb_Whitelist]
--DECLARE @Counter INT, @Max INT
SELECT @Counter = 10000000
SELECT @Max = 19999900
WHILE @Counter <= @Max
BEGIN
INSERT [tb_Whitelist] ([AvailableId]) VALUES(@Counter)
SELECT @Counter = @Counter + 1
END
它需要7小时才能运行,我告诉它太慢了。是否有任何其他批量插入策略可以让我更快地插入一堆连续数字,或者我能做些什么来使这个更快地运行?
答案 0 :(得分:7)
尝试这样的事情......
INSERT [tb_Whitelist] ([AvailableId])
SELECT TOP (9999900)
10000000 + ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM master..spt_values t1
cross join master..spt_values t2
cross join master..spt_values t3
虽然循环速度很慢,但我只是在我的笔记本电脑上运行了这个查询,它有8GB Ram和非常标准的处理器,我花了1分45秒来插入这些记录。
答案 1 :(得分:1)
避免 RBAR 。尝试使用CTE并插入单个语句。
DECLARE
@counter INT = 1,
@max INT = 50000;
with i (i) AS (
select @counter i
UNION ALL
select i+1 from i
where
i< @MAX
)
insert into [tb_Whitelist]
([AvailableId])
select
i
from i
OPTION(MAXRECURSION 0)