我正在编写一个存储过程,用于将行插入到表中。问题是,在某些操作中,我们可能希望插入超过100万行,并且我们希望使它快速完成。另一件事是,其中一个列是 Nvarchar(MAX)
。我们可能希望在此列中放置平均1000个字符。
首先,我编写了一个逐行插入的存储过程。然后,我生成了一些随机数据进行插入,其中 NVARCHAR(MAX)
列为1000个字符的字符串。然后使用循环调用存储过程插入这些行。如果我使用SQL服务器登录数据库服务器进行插入,则性能非常差,需要48分钟。如果我使用C#连接到桌面上的服务器(这通常是我们想要做的),则需要超过90分钟。
然后,我更改了存储过程以接受表类型参数作为输入。我以某种方式准备了这些行并将它们放入表类型参数中,然后通过以下命令进行插入:
INSERT INTO tableA SELECT * from @tableTypeParameterB
我尝试过将批量大小设置为1000行和3000行(将1000-3000行放入@tableTypeParameterB中,一次性插入)。但性能仍然很差。如果我在SQL服务器上运行它,插入100万行需要约3分钟,如果我使用C#程序从我的桌面连接,则需要大约10分钟。
tableA
具有两列的聚集索引。
我的目标是尽可能快地进行插入(我的理想目标是在1分钟内完成)。是否有任何方式可以优化它?
更新:
我尝试了一些人建议的批量复制插入。我尝试使用SQLBULKCOPY一次性插入1000行和10000行。性能仍然需要10分钟来插入100万行(每一行都有一个长度为1000个字符的列)。没有提高性能。是否有其他建议?
基于评论的更新:
实际上,数据来自UI。用户将使用UI批量选择,例如选择一百万行并将其中一列从旧值更改为新值。此操作将在单独的过程中完成。但是这里我们需要做的是使中间层服务从UI获取旧值和新值,并将它们插入表中。旧值和新值可能长达4000个字符,平均为1000个字符。我认为长字符串的旧/新值会降低速度,因为当我将测试数据的旧值/新值更改为20-50个字符并插入时,无论使用SQLBulkCopy还是表类型变量,速度都非常快。