4.7 大对象存储
从用户可操作的角度看,PG提供了一套函数接口,用以操作大对象。如:lo_create、lo_open、lo_write、lo_close等。
大对象的存储,可以从lo_write函数中得知如下信息:
1. 大对象,会被拆分为一个个“LOBLKSIZE”(2k)大小的子项,当作元组项,置于数据页中(调用heap_form_tuple形成一个个tuple,然后用simple_heap_insert插入到页面中)
2. 大对象被拆分后,连续在页面上存储,可以跨页存储,但每次存储的单位是tuple(LOBLKSIZE大小)
4.8 物理IO调用方式
如果没有缓存(buf)这一层,读写元组或读写列,就需要直接调用IO函数了。就像作者在《PostgreSQL之精妙的数据库导入导出工具架构 (四)》等系列中写的一样,PG的导入导出工具,直接操作外存和物理IO打交道,所以直接调用read、write等C函数操作外存。
而存储层,涉及保存数据的地方,都是对buf操作,是一种逻辑IO的方式,所以,并不涉及直接调用read、write等C函数操作外存。
因为有了IO,逻辑IO和物理IO完全分离,使得操作IO的效率大为提高。读写tuple,完全建立在内存上,所以,没有了调用read、write等C函数操作的处理工作,减少物理IO操作提升了效率。