5

我想知道SqlDataAdapter内部是如何工作的,特别是在UpdateCommand用于更新一个巨大的DataTable(因为它通常比从循环中发送 sql 语句要快得多)。

这是我的一些想法:

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

1 回答 1

7

它使用称为命令集的 SQL Server 客户端类的内部工具。您可以使用单个命令将多个批次发送到 SQL Server。这减少了每次调用的开销。你有更少的服务器往返等。

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

不幸的是,这个设施没有公开Ayende 对此进行了破解,并为它构建了一个私有反射基础 API。

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

也就是说,您自己可以比这更快:使用 TVP 传输更新数据并发出一个UPDATE更新许多行的单一数据。这样,您就可以节省所有每批次、每往返和每条语句的开销。

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

update T set T.x = @src.x from T join @src on T.ID = @src.ID
于 2012-12-19T23:05:30.083 回答