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)
有没有人有更好的方法来做到这一点?
您的主要问题是每个语句都在一个单独的事务中运行.将所有内容放在一个事务中是不可取的,因为非常大的事务会产生自己的问题.
但是代码中最大的瓶颈是事务日志中的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)
从某处抓住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)
| 归档时间: |
|
| 查看次数: |
18364 次 |
| 最近记录: |