Postgres 的 UPDATE SET x = NULL 策略

gav*_*koa 6 postgresql vacuum postgresql-performance

目前尚不清楚当列设置为 时 Postgres 采取的策略NULL

UPDATE tbl SET
  col1 = NULL,
  col2 = NULL
WHERE created < current_date - INTERVAL '1 year';
Run Code Online (Sandbox Code Playgroud)

文档https://www.postgresql.org/docs/current/mvcc.html有点冗长和技术性,所以我无法可靠地推断:

是否就地执行设置为 NULL 或复制受影响的行/页

看起来任何 UPDATE 都应该为 MVCC 语义创建新行,但如果设置为 NULL 是一种特殊情况怎么办?

为了遵守 GDPR,我认为要清空所有个人历史数据,并尝试理解大规模定期数据的含义UPDATE SET x = NULL。我应该考虑VACUUM之后吗?

Lau*_*lbe 10

UPDATEPostgreSQL 从不通过修改现有数据来执行操作。如果将 columns 设置为NULL,则将像任何其他行版本一样创建新的行版本UPDATE,并且先前的行版本将保留到VACUUM回收它们为止。

\n

但请注意

\n
    \n
  • VACUUM仅当不存在仍可能需要旧数据的长时间运行的事务时,才会删除旧的行版本。
  • \n
  • VACUUM不会覆盖数据,因此旧值仍将保留在磁盘上,直到重新使用空间。
  • \n
\n

关于 GDPR,措辞是

\n
\n

数据主体有权要求控制者立即删除与其有关的个人数据,控制者有义务立即删除个人数据

\n
\n

该法律中没有对术语 \xe2\x80\x9cerasure\xe2\x80\x9d 进行定义,因此需要对其进行解释。我敢打赌,很少有人能够很好地理解 PostgreSQL 的内部运作方式来质疑这种DELETE擦除行为。需要具有高级 PostgreSQL 知识的数据取证专家才能检索此类数据。一旦VACUUM跑了,就几乎不可能做到这一点。如果我作为专家证人被传唤到法庭,我会说任何DELETE在数据库中运行过的人都已采取一切可能的步骤来删除数据。

\n

如果您感到偏执,请VACUUM在有问题的桌子上安排一个常客,并确保您没有长时间运行的事务。除此之外的任何担忧都是愚蠢的。

\n