目前 PostgreSQL 提供一个内置触发器函数 suppress_redundant_updates_trigger,它会阻止那些实际上不会改变行中数据的更新。通常的行为则是无论数据是否改变都执行更新。(这种通常行为不需要检查,因此更新运行得更快,并且在某些情况下也有用。)
理想情况下,应尽量避免执行实际上不会改变记录中数据的更新。冗余更新会耗费大量不必要的时间,尤其是在需要改动许多索引时;它们还会使死行占用空间,最终需要通过清理回收。但是,在客户端代码中检测这种情况并不总是容易,甚至可能无法做到,而编写用于检测的表达式也容易出错。另一种办法是使用 suppress_redundant_updates_trigger,跳过不改变数据的更新。但使用时应当谨慎。此触发器处理每条记录的耗时虽小,却不可忽略,因此如果一次更新涉及的大多数记录确实会改变,使用此触发器反而会使更新更慢。
该suppress_redundant_updates_trigger函数可以按如下方式添加到表中:
CREATE TRIGGER z_min_update BEFORE UPDATE ON tablename FOR EACH ROW EXECUTE FUNCTION suppress_redundant_updates_trigger();
在大多数情况下,应让该触发器对每一行最后触发。由于触发器按名称顺序触发,应选择一个排序位于表上其他所有触发器名称之后的名称。
有关创建触发器的更多信息,请参考CREATE TRIGGER。