0

从 C# 结束:发送多个插入语句以在数据库中插入 20 行或更多行或将插入语句堆积在单个字符串中并执行该 sql 字符串。哪个更有效率?有什么优点和缺点?

例如:

for(int i=0;i<21;i++)
{
      //Insert command here  
}

或者

string qry="Insert into table1 () values "
for(int i=0;i<21;i++)
{
  qry+="(values)";
}
4

3 回答 3

2

如果您尝试执行批量插入操作,我建议您查看针对此特定操作进行了优化的SqlBulkCopy类。相反,如果您只是对各种数据插入方法的相对性能感到好奇——从我使用表值参数的实验来看,与大量即席插入语句相比,它们具有非常高的性能——其中许多是“批量插入” ,就像你提到的那样。

长话短说——你将不得不使用你的数据和模式来衡量最适合你的东西。但我确实推荐 TVP 和 sqlbulkcopy 类。

于 2013-04-02T23:06:27.270 回答
0

如果您要发送一堆插入,则应该使用事务,因为这大大提高了效率。

BEGIN;
INSERT .... ;
INSERT .... ;
INSERT .... ;
INSERT .... ;
INSERT .... ;
COMMIT;

INSERT .... ;
INSERT .... ;
INSERT .... ;
INSERT .... ;
INSERT .... ;
于 2013-04-02T23:05:24.397 回答
-1

我使用 2 种方法(在实体框架之外)。如前所述,如果您有大量记录 > 5000,请使用 SqlBulkCopy。没有什么比这更快了。它使用数据表,因此在处理对象时它不是最好的。

我们与业务对象一起使用的另一个选项是 XML。我们的业务对象有一个生成 xml 的序列化方法......然后我们有一个如下所示的存储过程。它比仅传递字符串具有更高的子成本,但是您将让 sql server 验证语法是否正确,列名是否正确等。另外,sql server 将缓存执行计划。在进行更改时,传入字符串很容易出现拼写错误和问题。

@xDoc XML

INSERT INTO dbo.Test(Id,Txt)
SELECT Data.Id,Data.Txt
FROM
(SELECT
    X.Data.value('Id[1]', 'int') AS Id,
    X.Data.value('Txt[1]', 'tinyint') AS Txt
FROM @xDoc.nodes('MyRootNode/MyRecord') AS X(Data)) AS Data;
于 2013-04-03T00:12:05.197 回答