先说 heap_insert 函数:


我如果执行一个普通的sql文,则可以加入这样的调试代码,来看看我是否确实向我想要的表中插入数据:
当我执行 create tablespace的时候,我想它是要写入数据字典的。
但是上述代码反应出来的relNode是不正确的,而 relname也是空的值。
然后我从更高测调用层面来观察:
当我执行 create tablespace的时候,调用关系如下:
PostgresMain-->exec_simple_query-->PortalRun-->PortalRunMulti-->PortalRunUtility-->Createtablespace
-->simple_heap_insert-->heap_insert
再看 Createtablespace函数:




我把它简练化,看看它都干了什么:


而 heap_open(TableSpaceRelationId, RowExclusiveLock) 这一句,
里面的 TableSpaceRelationId其实是宏:
而如果想要看到值,可以运行下面的语句,恰好 1213 对应的就是 pg_tablespace 表。


但是,实际上,pg_tablespace是数据字典,而数据库的目录中,并不存在一个单独的1213文件与之对应。
如果我用上述的:
来看,就会知道 relNode是 12587。
我可以在 global目录下,找到这个 12587文件。
1213 对应着 12587文件。这是一个比较怪异的事情。
本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/p/3167337.html,如需转载请自行联系原作者