【PostgreSQL使用教程】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, 
  24.  * since clients will often be written to send data in power-of-2 blocks. 
  25.  * This avoids unnecessary tuple updates caused by partial-page writes. 
  26.  */  
  27. #define LOBLKSIZE  (BLCKSZ / 4)   
  28.   
  29. CATALOG(pg_largeobject,2613) BKI_WITHOUT_OIDS  
  30. {  
  31.     Oid         loid;           /* Identifier of large object */  
  32.     int4        pageno;         /* Page number (starting from 0) */  
  33.     /* data has variable length, but we allow direct access; see inv_api.c */  
  34.     bytea       data;           /* Data for page (may be zero-length) */  
  35. } FormData_pg_largeobject;  

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

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

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

相关内容