postgresql 中的 large object

前端之家收集整理的这篇文章主要介绍了postgresql 中的 large object前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

  1. //主要有下面两个系统表,pg_largeobject_Metadata主要记录权限的,有用的只有pg_largeobject
  2.  
  3.  
  4.  
  5. CATALOG(pg_largeobject_Metadata,2995)
  6. {
  7. Oid lomowner; /* OID of the largeobject owner */
  8. #ifdef CATALOG_VARLEN /* variable-length fields start here */
  9. aclitem lomacl[1]; /* access permissions */
  10. #endif
  11. } FormData_pg_largeobject_Metadata;
  12.  
  13. /*
  14. * Each "page" (tuple) of a large object can hold this much data
  15. *
  16. * We could set this as high as BLCKSZ less some overhead,but it seems
  17. * better to make it a smaller value,so that not as much space is used
  18. * up when a page-tuple is updated. Note that the value is deliberately
  19. * chosen large enough to trigger the tuple toaster,so that we will
  20. * attempt to compress page tuples in-line. (But they won't be moved off
  21. * unless the user creates a toast-table for pg_largeobject...)
  22. *
  23. * 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.
  24. * This avoids unnecessary tuple updates caused by partial-page writes.
  25. */
  26. #define LOBLKSIZE(BLCKSZ / 4)
  27.  
  28. CATALOG(pg_largeobject,2613) BKI_WITHOUT_OIDS
  29. {
  30. Oid loid; /* Identifier of large object */
  31. int4 pageno; /* Page number (starting from 0) */
  32. /* data has variable length,but we allow direct access; see inv_api.c */
  33. bytea data; /* Data for page (may be zero-length) */
  34. } FormData_pg_largeobject;
  35.  
  36.  
  37.  

所有的大对象全部拆成 LOBLKSIZE大小,放入 pg_largeobject 之中,通过 loid进行区分,每个大对象拆分成的各个部分通过 pageno(叫元组序号更合理),进行顺序的关联起来,

pageno是通过 要写入的数据offset / LOBLKSIZE计算的

pg的大对象实现的比较简单,并不适合大数据量的使用,会成为系统的瓶颈.

猜你在找的Postgre SQL相关文章