SQL Server将大量行插入到具有默认值和标识列的表中

Nar*_*esh 4 sql-server insert identity-column sql-server-2008

我需要在一个包含2列的表中插入大约6400000行

CREATE TABLE [DBName].[DBO].[BigList] 
(
[All_ID] [int] identity(1,1) NOT NULL, 
[Is_It_Occupied] [int] default(0) not null 
)
Run Code Online (Sandbox Code Playgroud)

我今天使用以下代码,这需要很长时间约100分钟.

    SET @NumberOfRecordsToInsert = 6400000;
WHILE (@NumberOfRecordsToInsert > 0)
BEGIN
    INSERT [DBName].[DBO].[BigList] DEFAULT VALUES;
    SET @NumberOfRecordsToInsert = @NumberOfRecordsToInsert - 1
END
Run Code Online (Sandbox Code Playgroud)

有没有人有更好的方法来做到这一点?

TTo*_*oni 7

您的主要问题是每个语句都在一个单独的事务中运行.将所有内容放在一个事务中是不可取的,因为非常大的事务会产生自己的问题.

但是代码中最大的瓶颈是事务日志中的I/O. 以下代码在我的笔记本电脑(使用Samsung 840 SSD)上实现了14 MB/s的总写入速率,并在75秒内运行:

DECLARE @NumberOfRecordsToInsert INT = 6400000;
DECLARE @Inner INT = 10000;
SET NOCOUNT ON
WHILE (@NumberOfRecordsToInsert > 0)
BEGIN
    BEGIN TRAN
      SET @Inner = 0
      WHILE (@Inner < 10000)
      BEGIN
        INSERT [BigList] DEFAULT VALUES;
        SET @Inner = @Inner+1
      END
    COMMIT
    SET @NumberOfRecordsToInsert = @NumberOfRecordsToInsert - @Inner
END
Run Code Online (Sandbox Code Playgroud)


Mik*_*son 6

从某处抓住6400000行并立即插入所有行.

insert into BigList(Is_It_Occupied)
select top(6400000) 0
from sys.all_objects as o1
  cross join sys.all_objects as o2
  cross join sys.all_objects as o3
Run Code Online (Sandbox Code Playgroud)

是否测试了不同解决方案在我的计算机上花了多长时间.

Solution                                           Seconds
-------------------------------------------------- -----------
Mikael Eriksson                                    13
Naresh                                             832
Dd2                                                25
TToni                                              92
Milica Medic                                       90
marc_s                                             2239
Run Code Online (Sandbox Code Playgroud)