SqlDataAdapter如何在内部工作?

时间:2012-12-19 23:02:05

标签: c# sql-server database internals sqldataadapter

我想知道SqlDataAdapter内部是如何工作的,尤其是在使用UpdateCommand来更新巨大的DataTable时(因为从循环中发送sql语句通常要快得多)。

以下是我的想法:

  • 它创建一个准备好的sql语句(使用SqlCommand.Prepare()),填充CommandText并使用正确的sql类型初始化sql参数。然后,它在需要更新的数据行上循环,并为每条记录更新参数值,并调用SqlCommand.ExecuteNonQuery()
  • 它会创建一堆SqlCommand个对象,其中包含所有内容(CommandText和sql参数)。然后将多个SqlCommands一次性批处理到服务器(取决于UpdateBatchSize)。
  • 它使用一些特殊的,低级的或未记录的sql驱动程序指令,允许以有效的方式对多行执行更新(需要使用特殊的数据格式和相同的sql查询来提供要更新的行({ {1}}这里将对每一行执行。)

1 个答案:

答案 0 :(得分:6)

它使用SQL Server客户端类的内部工具,称为命令集。您可以使用单个命令向SQL Server发送多个批处理。这减少了每次呼叫的开销。您的服务器往返次数较少等。

每个语句更新一行,每批发送一个语句,但每个往返发送多个批次。此列表中的最后一点是魔术酱

不幸的是,此设施未公开Ayende took a hack on this and built a private-reflection bases API for it.

如果您想了解更多信息,我建议您查看内部SqlCommandSet课程。

那就是说,你可以自己比这更快:使用TVP传输更新数据并发出一个更新许多行的UPDATE。这样就可以保存所有按批次,每次往返和每个语句的开销。

这样的查询看起来像这样:

update T set T.x = @src.x from T join @src on T.ID = @src.ID