//主要有下面两个系统表,pg_largeobject_metadata主要记录权限的,有用的只有pg_largeobject CATALOG(pg_largeobject_metadata,2995) { Oid lomowner; /* OID of the largeobject owner */ #ifdef CATALOG_VARLEN /* variable-length fields start here */ aclitem lomacl[1]; /* access permissions */ #endif } FormData_pg_largeobject_metadata; /* * Each "page" (tuple) of a large object can hold this much data * * We could set this as high as BLCKSZ less some overhead,but it seems * better to make it a smaller value,so that not as much space is used * up when a page-tuple is updated. Note that the value is deliberately * chosen large enough to trigger the tuple toaster,so that we will * attempt to compress page tuples in-line. (But they won't be moved off * unless the user creates a toast-table for pg_largeobject...) * * Also,it seems to be a smart move to make the page size be a power of 2,* since clients will often be written to send data in power-of-2 blocks. * This avoids unnecessary tuple updates caused by partial-page writes. */ #define LOBLKSIZE(BLCKSZ / 4) CATALOG(pg_largeobject,2613) BKI_WITHOUT_OIDS { Oid loid; /* Identifier of large object */ int4 pageno; /* Page number (starting from 0) */ /* data has variable length,but we allow direct access; see inv_api.c */ bytea data; /* Data for page (may be zero-length) */ } FormData_pg_largeobject;
所有的大对象全部拆成 LOBLKSIZE大小,放入 pg_largeobject 之中,通过 loid进行区分,每个大对象拆分成的各个部分通过 pageno(叫元组序号更合理),进行顺序的关联起来,
pageno是通过 要写入的数据offset / LOBLKSIZE计算的
pg的大对象实现的比较简单,并不适合大数据量的使用,会成为系统的瓶颈.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。