在SQL Server中插入100万行的最快方法

Man*_*ndy 10 c# sql sql-server

我正在编写一个存储过程来将行插入表中.问题是,在某些操作中,我们可能希望插入超过100万行,并且我们希望使其快速.另一件事是,在其中一个专栏中,它是Nvarchar(MAX).我们可能希望在此列中放置平均1000个字符.

首先,我写了一个prc来逐行插入.然后我生成一些随机数据用于插入,NVARCHAR(MAX)列为1000个字符的字符串.然后使用循环调用prc来插入行.如果我使用SQL服务器登录要插入的数据库服务器,则perf非常糟糕,需要48分钟.如果我使用C#连接到我桌面上的服务器(这是我们通常想要做的),则需要大约90分钟.

然后,我更改了prc以获取表类型参数作为输入.我以某种方式准备了行并将它们放在表类型参数中并通过以下命令执行插入:

INSERT INTO tableA SELECT * from @tableTypeParameterB
Run Code Online (Sandbox Code Playgroud)

我尝试批量大小为1000行和3000行(在@tableTypeParameterB中放入1000-3000行以插入一次).表现仍然不好.如果我在SQL服务器中运行它需要大约3分钟来插入100万行,如果我使用C#程序从我的桌面连接则需要大约10分钟.

tableA有一个包含2列的聚簇索引.

我的目标是尽可能快地插入(我的想法目标是在1分钟内).有没有办法优化它?


只是一个更新:

我尝试了下面的一些人建议的批量复制插入.我尝试使用SQLBULKCOPY一次插入1000行和10000行.插入100万行的性能仍然是10分钟(每行有一个1000字符的列).没有性能提升.还有其他建议吗?


基于评论的更新需要.

数据实际上来自UI.用户将更改使用UI以批量选择,我们说,一百万行,并将一列从旧值更改为新值.此操作将在单独的过程中完成.但是,我们需要做的是使中间层服务从UI获取旧值和新值并将其插入表中.旧值和新值最多可包含4000个字符,平均值为1000个字符.我认为长字符串旧/新值会降低速度,因为当我将测试数据旧值/新值更改为20-50个字符并且插入非常快时无论使用SQLBulkCopy还是表类型变量

Eva*_*tti 7

如果您更喜欢使用SQL,我认为您正在寻找的是批量插入.

或者还有ADO.NET for Batch Operations选项,因此您可以将逻辑保留在C#应用程序中.这篇文章也很完整.

更新

是的,我担心批量插入只能用于导入的文件(来自数据库内).

我有一个Java项目的经验,我们需要插入数百万行(数据来自应用程序外部btw).

数据库是Oracle,所以我们当然使用了Oracle的多行插入.原来,在Java批量更新是比甲骨文的多值插入(所谓的"批量更新")更快.

我的建议是:

如果您要操作的数据来自应用程序外部(如果它不在数据库中),我会说只是去ADO.NET批量插入.我认为这是你的情况.

注意:请记住,批量插入通常使用相同的查询.这就是他们如此快速的原因.