Chapter 28 大对象.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Chapter 28 大对象

Chapter 28. 大对象 PostgreSQL 有一个大对象设施, 它为存储在特殊的大对象结构里的用户数据提供流状的访问方式。 流访问对那些数据值太大,因而不能一次性操作的数据是很有用的。 本章描述 PostgreSQL 大对象数据的实现以及编程和查询语言接口。 我们在本章中使用 libpq 的 C 库作为例子, 但是大多数 PostgreSQL 内置的接口都支持等效的功能。 其它接口可以在内部使用大对象接口以提供对大对象值的一般性支持。那些内容没有在这里描述。 28.1. 历史 最初,PostgreSQL 4.2 (PostgreSQL 的间接前身)支持三种大对象的标准实现: 作为 POSTGRES服务器外部的文件扩展, 作为由 POSTGRES 管理的外部文件, 以及作为存储在 POSTGRES 数据库里面的数据. 这样做容易导致用户的迷惑.结果是,我们只支持把大对象作为数据存储在 PostgreSQL 数据库里. 即使这样做令数据访问变得有些慢,但却保证了更严格的数据完整性. 由于历史原因,这种存储机制被称为转置大对象. (我们将在本章中交互使用转置和大对象来表示同一个意思)。 自 PostgreSQL 7.1 开始,所由大对象都保留在一个叫pg_largeobject的系统表里. PostgreSQL 7.1 引入了一种新的机制 (外号叫 TOAST), 允许数据行远远大于单个数据页面。这样就令大对象接口在一定程度上过时了。 大对象接口剩余的一个优点是它允许数据最大有 2 G,而 TOAST 字段只能处理 1 G。 并且,大对象可以比普通数据值更容易地一片片操作,因此,实际地局限是不一定的。 28.2. 实现特点 转置大对象把大对象分解成块 (chunks), 然后把块存放在数据库记录里面。 在随机读写时使用一个B-tree 索引保证对正确的块(chunk)号的检索。 28.3. 客户端接口 本节描述 PostgreSQL 客户端接口库提供来访问大对象的设施。 所有使用这些函数进行的大对象操作都必须在一个SQL事务里实现。 (这个要求是自 PostgreSQL 6.5 以来的一个严格的要求,虽然在以前的版本里就隐含这样的要求,如果忽略这一点会导致错误的表现。) PostgreSQL大对象接口是对 Unix 文件系统的模仿,有仿真的 open,read, write, lseek,等. 使用 libpq 里面大对象接口的客户端应用应该包含头文件 libpq/libpq-fs.h 并且和 libpq 库链接。 28.3.1. 创建大对象 函数 Oid lo_creat(PGconn *conn, int mode); 创建一个新的大对象. mode是一个位掩码, 描述新对象的不同属性。 这里使用的符号常量在 libpq/libpq-fs.h 列出。 访问类型(读,写或者两者)是对位 INV_READ 和 INV_WRITE进行或操作构成的。 掩码的低十六位是大对象要存放于内的存储管理器号。 对于除 Berkeley (伯克利)以外的节点,这些位都应总是零。 (访问类型现在实际上也不作任何事情,但是其中一个或者两个位都需要置上,以避免错误。) 返回值是赋予新大对象的 OID,或者是失败的时候是 InvalidOid(零)。 例子: inv_oid = lo_creat(conn, INV_READ|INV_WRITE); 28.3.2. 输入大对象 要把一个操作系统文件输入成为大对象,调用 Oid lo_import(PGconn *conn, const char *filename); filename 参数指明要被输入成为大对象的操作系统文件路径名。返回值是赋予新大对象的 OID。 如果失败则返回 InvalidOid(零)。请注意这个文件是由客户端接口库读取的, 而不是服务器端;因此它必须存在于客户端文件系统上并且可以被客户应用读取。 28.3.3. 输出大对象 要把一个大对象输出为操作系统文件,调用 int lo_export(PGconn *conn, Oid lobjId, const char *filename); lobjId参数指明要输出的大对象 OID,filename 参数指明操作系统文件的路径名。请注意这个文件是由客户端接口库写入的, 而不是服务器端。成功时返回 1,失败时返回 -1。 28.3.4. 打开一个现有的大对象 要打开一个现存的大对象读写,调用 int lo_open(PGconn *conn, Oid lobjId, int mode); 参数lobjId指明要打开的大对象的 OID (对象标识)。 mode位控制该对象是用于读 (INV_READ

文档评论(0)

xy88118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档