【问题标题】:Obtaining the size of lobject in PostgreSQL获取PostgreSQL中lobject的大小
【发布时间】:2018-08-03 09:19:33
【问题描述】:

我想知道为什么PostgreSQL中没有直接获取大对象大小的函数。我相信可以seek() 对象的结尾,然后tell() 的位置,但这不是太贵了吗?我在谷歌上找不到任何关于它的信息?那么获取 lobject 大小的正确方法是什么?如果要填充Content-Size http 头?

【问题讨论】:

标签: database api postgresql


【解决方案1】:

这个功能对我来说已经足够高效了,你可以用你的数据试试:

CREATE OR REPLACE FUNCTION lo_size(oid) RETURNS integer 
AS $$ 
declare 
 fd integer; 
 sz integer; 
begin 
 fd = lo_open($1, 262144);
 if (fd<0) then
   raise exception 'Failed to open large object %', $1;
 end if;
 sz=lo_lseek(fd,0,2);
 if (lo_close(fd)!=0) then
   raise exception 'Failed to close large object %', $1;
 end if;
 return sz;
end; 
$$ LANGUAGE 'plpgsql'; 

另一个选项是select sum(length(data)) from pg_largeobject where loid=the_oid,但它需要对 pg_largeobject 的读取访问权限,我认为非超级用户在 pg_largeobject 中已被禁止

【讨论】:

  • 我还要证明使用长度(数据)方法比寻找和告诉要慢得多。至少在我的 8.4 上,在 370 条记录上,使用 sum() - 30 秒,使用 open/seek - 1 秒。谢谢你,丹尼尔。
猜你喜欢
  • 1970-01-01
  • 2012-04-27
  • 2017-03-19
  • 2019-09-20
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
相关资源
最近更新 更多