从 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)";
}
从 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)";
}
如果您尝试执行批量插入操作,我建议您查看针对此特定操作进行了优化的SqlBulkCopy类。相反,如果您只是对各种数据插入方法的相对性能感到好奇——从我使用表值参数的实验来看,与大量即席插入语句相比,它们具有非常高的性能——其中许多是“批量插入” ,就像你提到的那样。
长话短说——你将不得不使用你的数据和模式来衡量最适合你的东西。但我确实推荐 TVP 和 sqlbulkcopy 类。
如果您要发送一堆插入,则应该使用事务,因为这大大提高了效率。
BEGIN;
INSERT .... ;
INSERT .... ;
INSERT .... ;
INSERT .... ;
INSERT .... ;
COMMIT;
比
INSERT .... ;
INSERT .... ;
INSERT .... ;
INSERT .... ;
INSERT .... ;
我使用 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;