Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance Postgres-没有实际更新,有副作用吗?_Performance_Postgresql_Query Performance - Fatal编程技术网

Performance Postgres-没有实际更新,有副作用吗?

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 =

我有一张桌子,可以放大约50万行。我想执行一个简单的更新查询:

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)的情况。然而,这两种说法的结果并不完全相同;或者,至少,它们不是一般的

有两个主要的副作用:

  • 第一个查询(no where子句)将扫描并处理表中的所有行。在第二种情况下,如果有适当的索引,它可能只处理几行。就“桌上的东西”(排除触发器的影响)而言,最终结果将是相同的。实现这一最终结果所需的时间可能会大不相同

  • 如果表(或视图)具有激发“更新时”和“针对每一行”(请参阅)的触发器,则将在第一次查询时针对表上的每一行调用触发器函数,并且仅针对第二次查询时WHERE条件为真的行
    WHERE
    WHERE。还有两个区别:(1)时间和(2)触发器的动作。例如,如果触发器将更新一个“lastmod”列,那么它将为第一种情况下的每一行更新它[这可能不是您想要的]

  • 。。。还有第三个可能:

  • 在充分并发的场景中:第一个查询将阻塞表中的所有行;或者该语句可能被阻止更新某些行,因为另一个事务正在同时更新它们。因此,要么等待时间过长,要么死锁。更新的行数越高,对争用产生影响的可能性就越高。。。(或死锁等)
  • 最常用的更新方法是使用带有
    WHERE
    子句的查询。一些非常特殊的情况可能会建议使用第一个(例如,您实际上希望更新“lastmod”列,即使行中的其余值没有更新)


    “默认情况下”使用
    WHERE
    进行查询。有些数据库(例如:MySQL和)甚至可能不允许在没有
    WHERE
    子句的情况下执行更新(或删除)

    它将更新尽可能多的行。在没有
    where
    的情况下,它将更新所有行,因此请务必使用第二个语句强制使用where子句,否则所有行都将受到影响。模糊层-也称为“ORM”;)@克林:ORM不代表“模糊关系模型”?:)我想是的,尤其是当我看到这样的问题时,比如如何在ORM中编写这个查询?