2013-07-30 30 views
2

我写了一些工资核算处理软件,最终使用SqlDataAdapter.Insert()将数据写入到SQL Server表中。 (我使用的默认插入命令是使用SqlCommandBuilder()创建的。)我在Windows 7上使用.NET Framework 4,写入SQL Server 2008(不是R2)Std Edition x64 SP3。问题是,我的电脑(Dell Optiplex 990 Core i7)到SQL Server(我的PC上的NIC,服务器上都是GB Enet)的吞吐量只有2 Mbps,但两者之间存在一些100 Mbps的交换机,造成了不幸的瓶颈,但仍然是 - 100Mbps)。我可以将文件从我的电脑复制到运行SQL Server的服务器,并且我没有吞吐量问题 - 我可以非常接近100 Mbps的吞吐量。我把数据库放在另一个运行2008 R2的LAN SQL Server上,我设法获得了5 Mbps的吞吐量,但仍然 - 非常慢。当Insert()命令正在运行时,我的PC的CPU接近0。我试图增加和减少SqlConnection.ConnectionString属性中的数据包大小参数,但是没有做任何事情。SqlDataAdapter插入性能差

如果我从我的PC上的SSMS执行SELECT * FROM <table>到所讨论的SQL Server,我可以获得大约45 Mbps的持续吞吐量。

我不知道在哪里看下一个罪魁祸首 - 任何建议表示赞赏。

+0

执行更新时修改了多少行? “更新”命令仅处理更改的行。另外,你为什么要做'从

'选择*而不是'从
'选择*,其中filterColumn = @ filter'如果查询的行数足以使您的网卡达到最大,那么您可能会优化查询。 –

+0

@ScottChamberlain - 那里的脑部总动脉瘤 - 我的意思是'Insert()'。问题已得到解决。 – Conrad

+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); 
    } 
} 
+0

非常感谢 - 这正是我一直在寻找的。 – Conrad