Performance Postgres-没有实际更新,有副作用吗?
我有一张桌子,可以放大约50万行。我想执行一个简单的更新查询:Performance Postgres-没有实际更新,有副作用吗?,performance,postgresql,query-performance,Performance,Postgresql,Query Performance,我有一张桌子,可以放大约50万行。我想执行一个简单的更新查询: UPDATE the_table SET flag = true; 对于这些行中的99%,该标志已设置为true。因此,只需更改1%的行 我的问题是:博士后足够聪明,知道这一点吗?或者Postgres是否会改变这些99%的行,这将导致典型的过程,如WAL、自动真空、重新索引、同步到从属服务器等等。。。对于整个表,而不仅仅是这1%的行 换句话说,下面的查询是一种更安全的方法吗 UPDATE the_table SET flag =
UPDATE the_table SET flag = true;
对于这些行中的99%,该标志已设置为true。因此,只需更改1%的行
我的问题是:博士后足够聪明,知道这一点吗?或者Postgres是否会改变这些99%的行,这将导致典型的过程,如WAL、自动真空、重新索引、同步到从属服务器等等。。。对于整个表,而不仅仅是这1%的行
换句话说,下面的查询是一种更安全的方法吗
UPDATE the_table SET flag = true WHERE flag = false;
否,Postgres不会检查您是否正在更新相同的值 邮件列表上时不时会讨论这一点,但一致认为支票太贵了,让所有用户为只有少数用户(通常是模糊层不好的用户,也称为“ORM”)需要的东西付费是没有意义的
第二种解决方案是执行更新的安全和最佳方式。Postgres在执行更新时不会区分flag=true或flag=false(或者flag为null)的情况。然而,这两种说法的结果并不完全相同;或者,至少,它们不是一般的 有两个主要的副作用:
WHERE
WHERE。还有两个区别:(1)时间和(2)触发器的动作。例如,如果触发器将更新一个“lastmod”列,那么它将为第一种情况下的每一行更新它[这可能不是您想要的]WHERE
子句的查询。一些非常特殊的情况可能会建议使用第一个(例如,您实际上希望更新“lastmod”列,即使行中的其余值没有更新)
“默认情况下”使用
WHERE
进行查询。有些数据库(例如:MySQL和)甚至可能不允许在没有WHERE
子句的情况下执行更新(或删除) 它将更新尽可能多的行。在没有where
的情况下,它将更新所有行,因此请务必使用第二个语句强制使用where子句,否则所有行都将受到影响。模糊层-也称为“ORM”;)@克林:ORM不代表“模糊关系模型”?:)我想是的,尤其是当我看到这样的问题时,比如如何在ORM中编写这个查询?