2009-08-19 49 views
2

我有一个包含很多列(可能是100+)的表(实际上有几个)。更新表格中的行时,如果只更改了几列,那么性能最佳。更新表中有很多列的行

  1. 要动态构建UPDATE语句只更新已更改的列。
  2. 建立一个包含所有列的参数化UPDATE语句,包括那些没有改变的列。
  3. 创建一个将ALL值作为参数并更新行的过程。

我正在使用SQL Server。表中没有BLOBS。

感谢/ M

+0

你在一个100列以上的表中存储什么类型的数据? – 2009-08-19 20:45:01

+0

其实我没有统计有多少列,但有很多。数据模型没问题,只是表格中的实体有很多属性。 – 2009-08-19 20:51:02

回答

1

选项2和3在更新时需要更多数据传输到服务器 - 因此对于数据而言通信开销较大。

每行是否有一组不同的更新列,或者是对任何给定的运行更新相同的列集(但列表可能因运行而异)?在后一种情况下(在给定运行中更新了相同的一组列),则选项1可能表现更好;而在后一种情况下(在给定运行中更新相同的一组列)该声明将被准备一次,并且每次更新都会使用很多次,并且每次更新都将最少的数据传输到服务器。

在前一种情况下,我会查看是否有相对较小的子集被更改(例如,在不同行中更改了10列,即使任何一行只更改了其中的3列10)。在这种情况下,我可能会参数化为10列,接受传输7-9列值相对较小的开销,为了方便单个预准备语句,它们没有改变。如果更新列的集合遍布整个地图(例如,在整个操作中更新了100列中的50列以上),那么处理整个地段可能更简单。

在某种程度上,它取决于您的主机语言(客户端API)如何轻松地处理参数化更新的各种可能方式。

4

我要说号2和3是从性能的角度相等。如果您使用PK来确定要更新哪一行并且它是一个集群键,那么我不会担心将列更新为自己。第一种情况的问题是,你将导致“过程缓存膨胀”,你有很多类似的计划都会占用你的计划缓存,因为它们与更新稍有不同。

如果你打算做大规模的更新,我会毫不犹豫地推荐更新所有列,因为它可能会导致FK查找UPS等

感谢, 埃里克

+0

即使FK的值未更改,更新是否会导致FK查找? – 2009-08-19 20:53:00

+0

我认为它不会如果你自己设置一列,但我不确定。让我检查并回复你。 – Anon246 2009-08-19 21:17:20

+1

即使您更新为相同的值,也会出现查找。因此,在FK指向其他表的表上执行大量更新可能会导致扫描或寻找其他表。 (也是一个很好的理由,以确保你所有的PK/FK组合都被编入索引)。 – Anon246 2009-08-19 21:51:27

0

我投票的p .1与p.2混合使用,即动态构建参数化的UPDATE语句,该语句将只更新更改的列。当你的读/写速率在'read'一侧,并且你没有太频繁地更新更新时,这将适用于这种情况,所以我们可以安全地为(物理)更新性能交换查询计划缓存。