SqlDataAdapter插入性能不佳

时间:2013-07-30 19:48:31

标签: .net sql-server performance ado.net sqldataadapter

我写了一些工资单处理软件,最终使用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的持续吞吐量。

我不知道下一步该罪犯的罪魁祸首 - 任何建议都值得赞赏。

1 个答案:

答案 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);
    }
}