【发布时间】:2014-09-12 16:12:12
【问题描述】:
我正在编写一个存储过程来将行插入表中。问题在于,在某些操作中,我们可能想要插入超过 100 万行,并且我们想让它变得更快。另一件事是,在其中一个列中,它是Nvarchar(MAX)。我们可能希望在此列中放置平均 1000 个字符。
首先,我写了一个 prc 来逐行插入。然后我生成一些随机数据以插入 NVARCHAR(MAX) 列是 1000 个字符的字符串。然后使用循环调用 prc 来插入行。如果我使用 SQL 服务器登录数据库服务器进行插入,性能非常糟糕,需要 48 分钟。如果我在我的桌面使用C#连接到服务器(这是我们通常想要做的),大约需要90多分钟。
然后,我将 prc 更改为将表类型参数作为输入。我以某种方式准备了行并将它们放入表类型参数中并通过以下命令进行插入:
INSERT INTO tableA SELECT * from @tableTypeParameterB
我尝试将批量大小设置为 1000 行和 3000 行(将 1000-3000 行放入 @tableTypeParameterB 中以插入一次)。性能还是很差的。如果我在 SQL 服务器中运行插入 100 万行大约需要 3 分钟,如果我使用 C# 程序从我的桌面连接大约需要 10 分钟。
tableA 有一个包含 2 列的聚集索引。
我的目标是尽可能快地进行插入(我的想法目标是在 1 分钟内)。有什么办法可以优化吗?
只是更新:
我尝试了下面一些人建议的批量复制插入。我尝试使用 SQLBULKCOPY 一次插入 1000 行和 10000 行。插入 100 万行仍然需要 10 分钟(每行有 1000 个字符的列)。没有性能提升。还有其他建议吗?
基于 cmets 要求的更新。
数据实际上来自 UI。用户将使用 UI 更改为批量选择,我们说,一百万行并将一列从旧值更改为新值。此操作将在一个单独的过程中完成。但这里我们需要做的是让中间层服务从 UI 中获取旧值和新值并将它们插入到表中。旧值和新值最多可达 4000 个字符,平均为 1000 个字符。我认为长字符串旧值/新值会降低速度,因为当我将测试数据旧值/新值更改为 20-50 个字符时,无论使用 SQLBulkCopy 还是表类型变量,插入都非常快
【问题讨论】:
-
你应该看看 SqlBulkCopy
-
必须按顺序插入吗?
-
您是从某个文件中读取数据并插入吗?
-
目前我只是在做例子。我从另一个表中读取 1000 行并将其存储在数据表对象中。然后通过类似“插入tableA Select @i, Column1, Column2, Column3 ... ColumnN from @tmpTableTypePrameter”的命令将它们插入到tableA中1000次
-
我使用 BCP 在大约 20 秒内将来自这个拼图挑战的 1,000,000 百万行测试数据插入到笔记本电脑上的 SQL Serve 中:ask.sqlservercentral.com/questions/1227/…
标签: c# sql sql-server