如何快速批量插入一堆序列号?

时间:2015-04-07 16:54:55

标签: sql-server

我最近继承了这个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小时才能运行,我告诉它太慢了。是否有任何其他批量插入策略可以让我更快地插入一堆连续数字,或者我能做些什么来使这个更快地运行?

2 个答案:

答案 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)