为什么在PostgreSQL中执行UPDATE操作后,行转到最后一位?

问题描述

我在一些气味公司的工作面试中遇到这个问题。现在我知道这本身就是一个错误的问题。

我的建议是Postgresql先复制该行,然后删除上一行,即使用事务,然后按系统隐藏索引对行进行排序。

他们说这不是一个正确的答案,但他们无论如何也没有说出正确的答案,因为面试就像一个一个方向高速移动的乒乓球。

我问过核心团队的人,他们在IRC中制作Postgresql。他们说结果的顺序可能是不可预测的,并以非常低的C语言级别给了我Postgresql的文档,所以我一无所知。

现在我发现了这个语句https://www.postgresql.org/docs/current/sql-select.html

如果指定了ORDER BY子句,则返回的行将按以下顺序排序 指定的顺序。如果未给出ORDER BY,则返回行 系统以最快的速度找到生产最快的产品。 (请参阅ORDER BY 下面的条款。)

好的,但是如果我们使用非常简单的表而该方案中没有任何关系,该怎么办呢? USER(编号,名称)。有什么意义?为什么更新的行将位于最后一个位置?在面试中我应该回答什么?

解决方法

首先,不仅是PostgreSQL,而且是所有其他数据库,也不保证元组的顺序。插入时,每个元组都被写入PostgreSQL中的页面。然后,该页面将被写入磁盘并遵循相应的文件系统机制。除非指定了ORDER BY,否则新更新的行不一定要排在最后。新更新的行出现在最后一个位置的原因,可能是该文件系统采用了LRU替换策略。