Chinaunix首页 | 论坛 | 博客
  • 博客访问: 208862
  • 博文数量: 21
  • 博客积分: 1546
  • 博客等级: 上尉
  • 技术积分: 290
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-10 14:54
文章分类

全部博文(21)

文章存档

2020年(1)

2019年(3)

2015年(2)

2014年(1)

2011年(1)

2009年(7)

2008年(4)

2007年(2)

我的朋友

分类:

2009-10-15 16:55:00

在postgresql中,存储二进制数据的类型除了标准的bytea(等同于SQL中的blob)类型外,还有一个pg独有的大对象(largeobject)类型.
 
大对象类型实际上是个整型地址类型,它指向一张系统表pg_largeobejct的主键loid, 实际的内容都存在这张系统表里,而且这内容是按分块存储的.
 
查看pg_largeobject表结构
----------------------------------
loid     oid         大对象地址(整型)
pageno   integer     块号
data     bytea       实际数据, 按8192字节分块存储
primary key (loid,pageno)
----------------------------------
应用实例:
假如一张人事照片档案, 字段为员工ID和照片
 
假如图象类型用bytea, 那建表语句为
 create table em_photo1 (
  emp_id     integer not null primary key,
  photo      bytea
)
 
假如图象类型用大对象, 那建表语句为
 create table em_photo2 (
  emp_id     integer not null primary key,
  photo      oid
)
 
两者的区别和利弊:
1, 用大对象类型时,二进制数据统一存储在一张系统表里, 与其他数据分开,提高其他数据读写性能. 并能和其他数据分开备份.
 
2, 由于二进制数据是分块(大概每8kb一块)存储在大对象系统表里, 并且这系统表建有索引. 所以尺寸大的数据,  随机读写的性能将提高(比如只要读取后面多少字节), 若存储在bytea, 就没有这方面的优势.
 
3, 大对象类型的读取需要有专门的操作函数, 必须要写程序才能读取,比较烦琐,而bytea相对简单.
阅读(9862) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~