Вопрос по sql, postgresql – Получить размер большого объекта в запросе PostgreSQL?

11

Я хотел бы получить размер байта капли.

Я использую Postgresql и хотел бы получить размер с помощью запроса SQL. Что-то вроде этого:

<code>SELECT sizeof(field) FROM table;
</code>

Возможно ли это в Postgresql?

Обновление: я прочитал руководство по postgresql и не смог найти подходящую функцию для расчета размера файла. Также блоб хранится как большой объект.

@ DanielV & # xE9; rit & # xE9 ;: это выглядит обманом, но, честно говоря, я не смог найти этот вопрос, когда искал, прежде чем опубликовать свой ответ. Кто называет их «объектами», честно? ;-) Моя функция совершенно не похожа на вашу в этом вопросе, хотя в свою защиту, если бы я ее скопировал, я бы тоже скопировал обработку ошибок! Edmund
Пожалуйста, прочитайте руководство, прежде чем писать такой вопрос:postgresql.org/docs/current/static/functions.html a_horse_with_no_name
Определите «данные BLOB-объектов». Bytea столбец? Or a large object stored in pg_largeobject`? Покажите определение вашей таблицы. Erwin Brandstetter

Ваш Ответ

5   ответов
7
select pg_column_size(lo_get(lo_oid)) from table;

Дает вам размер в байтах.

Если вы хотите красивую печать:

select pg_size_pretty(pg_column_size(lo_get(lo_oid))::numeric) from table;
14

Не то чтобы я использовал большие объекты, но смотрю на документы:http://www.postgresql.org/docs/current/interactive/lo-interfaces.html#LO-TELL

Я думаю, что вы должны использовать ту же технику, которую требуют некоторые API-интерфейсы файловой системы: искать до конца, а затем указывать позицию. PostgreSQL имеет функции SQL, которые, по-видимому, обертывают внутренние функции языка Си. Я не смог найти много документации, но это сработало:

CREATE OR REPLACE FUNCTION get_lo_size(oid) RETURNS bigint
VOLATILE STRICT
LANGUAGE 'plpgsql'
AS $$
DECLARE
    fd integer;
    sz bigint;
BEGIN
    -- Open the LO; N.B. it needs to be in a transaction otherwise it will close immediately.
    -- Luckily a function invocation makes its own transaction if necessary.
    -- The mode x'40000'::int corresponds to the PostgreSQL LO mode INV_READ = 0x40000.
    fd := lo_open($1, x'40000'::int);
    -- Seek to the end.  2 = SEEK_END.
    PERFORM lo_lseek(fd, 0, 2);
    -- Fetch the current file position; since we're at the end, this is the size.
    sz := lo_tell(fd);
    -- Remember to close it, since the function may be called as part of a larger transaction.
    PERFORM lo_close(fd);
    -- Return the size.
    RETURN sz;
END;
$$; 

Тестирование это:

-- Make a new LO, returns an OID e.g. 1234567
SELECT lo_create(0);

-- Populate it with data somehow
...

-- Get the length.
SELECT get_lo_size(1234567);

Кажется, что функциональность LO предназначена для использования главным образом через клиента или через низкоуровневое программирование сервера, но, по крайней мере, они предоставили для него некоторые видимые функции SQL, что делает возможным вышеизложенное. Я сделал запрос дляSELECT relname FROM pg_proc where relname LIKE 'lo%' чтобы начать себя. Смутные воспоминания о программировании на C и немного исследований для режимаx'40000'::int а такжеSEEK_END = 2 Значение было необходимо для отдыха!

4

Пытатьсяlength() или жеoctet_length()

2

Это мое решение:

select
lo.loid,
pg_size_pretty(sum(octet_length(lo.data)))
from pg_largeobject lo
where lo.loid in (select pg_largeobject.loid from pg_largeobject)
group by lo.loid;
14

Вы можете изменить свое приложение для хранения размера при создании большого объекта. В противном случае вы можете использовать запрос, такой как:

select sum(length(lo.data)) from pg_largeobject lo
where lo.loid=XXXXXX

Вы также можете использовать API-функции больших объектов, как было предложено в предыдущем посте, они работают нормально, но на порядок медленнее, чем метод выбора, предложенный выше.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededpg_largeobjectError: User Rate Limit Exceededpostgresql.org/docs/current/static/catalog-pg-largeobject.html.

Похожие вопросы