我写了一些工资单处理软件,最终使用SqlDataAdapter.Insert()
将数据写入SQL Server表。 (我使用的是使用SqlCommandBuilder()
创建的默认插入命令。)我在Windows 7上使用.NET Framework 4,写入SQL Server 2008(不是R2)Std Edition x64 SP3。问题是,我只看到从我的PC(Dell Optiplex 990 Core i7)到SQL Server的大约2 Mbps吞吐量(我的PC和服务器上的NIC是GB Enet,但是它们之间有一些100Mbps的交换机,这是一个不幸的瓶颈,但仍然 - 100Mbps)。我可以将文件从我的PC复制到运行SQL Server的服务器,并且我没有吞吐量问题 - 我可以在那里获得非常接近100 Mbps的吞吐量。我将数据库放在另一台运行2008 R2的LAN SQL Server上,我设法获得5 Mbps的吞吐量,但仍然非常慢。 Insert()
命令运行时,我的PC的CPU接近0。我尝试增加和减少SqlConnection.ConnectionString
属性中的数据包大小参数,但这没有做任何事情。
如果我在PC上从SSMS执行SELECT * FROM <table>
到相关的SQL Server,我可以获得大约45 Mbps的持续吞吐量。
我不知道下一步该罪犯的罪魁祸首 - 任何建议都值得赞赏。
答案 0 :(得分:0)
SqlDataAdapter的Insert一次执行一条记录,如果要插入大量记录,则应使用SqlBulkCopy来减轻执行这些插入的开销。
using (SqlConnection destinationConnection = new SqlConnection(connectionString))
{
destinationConnection.Open();
using (SqlBulkCopy bulkCopy =
new SqlBulkCopy(destinationConnection))
{
bulkCopy.DestinationTableName = destTableName;
bulkCopy.WriteToServer(sourceDataTable);
}
}