SQL效率:更新几列与所有列

时间:2014-07-10 11:50:20

标签: sql

我必须识别行是否已更改并更新,如果是这样。在我的程序中,我有一个包含新值的字典,以及第二个字典,其中包含数据库中行的先前信息。

我想到了两种方法:

选项A 循环遍历字典与行值比较,如果有任何不同,则中断并更新所有字段。即UPDATE语句将包含所有字段及其值。

代码(在这种情况下是python,但很容易理解)看起来像这样:

for key, value in incoming_dictionary.iteritems():
    if old_dictionary[key] != value:
         update_row(incoming_dictionary)
         break

哪会产生这样的SQL语句:

UPDATE mytable SET field1=... field2=... fieldN=... WHERE = ...

选项B 循环在字典上比较值,而那些不同的值必须存储在另一个字典中,并在循环结束时更新行,将UPDATE语句限制为实际上不同的值。

changed_fields = {}
for key, value in incoming_dictionary.iteritems():
    if old_dictionary[key] != value:
         changed_fields[key] = value

update_fields(changed_fields)

哪会产生如下的SQL:

UPDATE mytable SET field1=... WHERE = ...

我想说第二个应该在SQL级别上更有效率,但我不太确定。它在编程层面上有一点开销。

我正在使用MS SQL Server,但我的程序解决了不同的RBDMS。感谢。

1 个答案:

答案 0 :(得分:2)

您的问题没有一般性答案。不同的数据库以不同方式执例如,MySQL不会更新没有更改的记录(比较是更新操作的一部分)。

通常,更新的费用取决于获取记录,记录更新和修改索引 - 这些操作不仅仅是对内存中数据的更改。作为指导原则,更重要的是有一个索引可以快速获取适当的记录,而不是优化数据库的填充。后者通常是记忆中的操作。

这些指南可能不适用于所有情况。例如,跨越多个页面的大字段的存在将影响性能。对具有索引的字段的更新具有其自身的性能影响。