对数据量大但更改集小的表进行批量更新/合并的最佳方法
本文关键字:更新 合并 方法 最佳 数据 | 更新日期: 2023-09-27 18:19:00
我有一个表,有200K+行,我需要每天更新。我的控制台应用程序在每天运行时生成所有这些数据,并需要使用结果更新表。
的情况是,我在一个缓慢的网络上操作,在每次运行时,有不到0.1%的行更新/插入/删除,所以显然有空间来优化。表是简单的- key列,加上2个nvarchar列。
所以我的问题是——在这种特殊情况下最好的方法是什么?我总是可以处理它并执行SQLBulkCopy,但是SqlDataAdapter会更有效吗?
Thx,
迈克随对存储过程的所有更改一起发布XML
访问数据库。
这里有一个老的例子:
http://granadacoder.wordpress.com/2009/01/27/bulk-insert-example-using-an-idatareader-to-strong-dataset-to-sql-server-xml/下面是一个较小的示例,但显示了基本内容。
http://www.mindfiresolutions.com/sending -多个记录——- xml - sql - server -存储-过程- 1861. php
发送xml到存储过程。将xml分解为一个@variable或#temp表。使用@variable或#temp表执行update/insert(或MERGE/UPSERT)。
编辑:http://weblogs.asp.net/dwahlin/archive/2009/09/30/passing-multiple-records-to-a-stored-procedure-in-sql-server.aspx另一个例子。
我喜欢做的是创建一个强数据集。将您的数据放入强数据集。然后将ds.GetXml()发送到存储过程。
这样,您就获得了强类型(使用强数据集),并且您不必编写自己的xml生成器,您可以依靠. getxml()。提示:创建强数据集后,删除名称空间(tempuri或类似的东西)
APPEND (Spring, 2019)
由于xml"膨胀",我不再将项放入强数据集(或任何数据集)。
我编写了一个自定义pocooobject - to - xml转换器(基于xml属性),并将其传递给存储过程。
下面是基于元素的…并显示了xml膨胀
<Employees>
<Employee>
<EmployeeKey>123</EmployeeKey>
<LastName>Smith</LastName>
<FirstName>John</FirstName>
</Employee>
<Employee>
<EmployeeKey>234</EmployeeKey>
<LastName>Jones</LastName>
<FirstName>Mary</FirstName>
</Employee>
</Employees>
vs (more trim down)
<Employees>
<Employee EmployeeKey="123" LastName="Smith" FirstName="John" />
<Employee EmployeeKey="234" LastName="Jones" FirstName="Mary" />
</Employees>
和下面的自定义转换器代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
namespace MyNamespace
{
public class EmployeesToXmlConverter
{
public string ConvertToXmlString(ICollection<EmployeePoco> emps)
{
StringBuilder sb = new StringBuilder();
XmlWriter writer = XmlWriter.Create(sb);
writer.WriteStartElement("root");
if (null != emps && emps.Any())
{
writer.WriteStartElement("Employees");
foreach (EmployeePoco emp in emps)
{
writer.WriteStartElement("Employee");
writer.WriteAttributeString("EmployeeKey", Convert.ToString(emp.EmployeeKey));
writer.WriteAttributeString("LastName", emp.LastName);
writer.WriteAttributeString("FirstName", emp.FirstName);
writer.WriteEndElement(); ////closing patient tag
}
writer.WriteEndElement(); ////closing emps tag
}
writer.WriteEndElement(); ////closing root tag
writer.Close();
string returnValue = sb.ToString();
return returnValue;
}
}
}