Получение размера объекта в PostgreSQL
Интересно, почему в PostgreSQL нет функции для непосредственного получения размера большого объекта. Я верю, что можно seek()
конец объекта, а затем tell()
положение, но не слишком ли дорого? Я не могу найти информацию об этом в Google? Итак, как правильно получить размер объекта, например, если вы хотите заполнить Content-Size
http заголовок?
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 9.0+ для не суперпользователей