我试图从内到外理解postgres,这是我到现在所学到的。
每个数据库在$ PG_DATA / base中都有自己的子目录($ PG_DATA是指向postgres安装目录的环境变量)
这可以通过发出查询SELECT datname, oid FROM pg_database WHERE datname = 'db_name';
来验证。然后我们就可以实际进入目录库中了。对于数据库没有逻辑结构,因为它只是一个存在文件的目录。
在这个目录中,表也被组织为带有oid的单个文件。这个oid可以通过以下查询获得SELECT relname, oid FROM pg_class WHERE relname = 'table_name';
。这些文件可以增长到1 GB,从那里可以拆分基于参数,通常会发生这种拆分以克服文件系统限制并且它是可调的。
直到这一点,一切都很好,但是我无法理解表中是如何组织元组的。从我看到的元组基本上是使用TOAST扩展的行,如果它们不适合页面内部基本上是存储的单位为8KB。
Postgres使用堆表的概念,更具体地说是用于存储从here引用的元组的无序堆。我知道min / max堆的概念,它基本上是二叉树的修改形式,但是无法找到与无序堆数据结构相关的任何参考/材料。
我的C知识有点生疏,所以查看实际的源代码对我没什么帮助。在理解无序堆结构方面有任何帮助,即如何组织表格作为表格将非常感激。