2012-04-16 4 views
9

블롭의 바이트 크기를 얻고 싶습니다.PostgreSQL 쿼리에서 큰 개체의 크기를 가져 옵니까?

저는 Postgresql을 사용 중이며 SQL 쿼리를 사용하여 크기를 가져오고 싶습니다. 다음과 같은 것 :

SELECT sizeof(field) FROM table; 

PostgreSQL에서 가능합니까?

업데이트 : postgresql 설명서를 읽었으며 파일 크기를 계산하는 데 적절한 함수를 찾을 수 없습니다. 또한 블롭은 큰 객체로 저장됩니다.

+0

같은 질문을 게시하기 전에 설명서를 읽어 보시기 바랍니다 : 당신이 꽤 인쇄하려면

정의 http://www.postgresql.org/docs/current/static/functions.html –

+2

을 "BLOB 데이터 ". 바이트 열'? 또는'pg_largeobject'에 저장된 큰 오브젝트? 테이블 정의를 표시하십시오. –

+0

[PostgresSQL에서 객체 크기 얻기] (http://stackoverflow.com/questions/9248738/obailable-the-size-of-lobject-in-postgressql)의 중복? –

답변

12

시도하지만, 문서보고 : 일부 파일 시스템 API가 필요로 같은 기술을 사용한다고 생각 http://www.postgresql.org/docs/current/interactive/lo-interfaces.html#LO-TELL

: 추구 끝, 다음 위치를 말해. PostgreSQL은 내부 C 함수를 감싸는 것처럼 보이는 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'::intSEEK_END = 2 값에 대한 약간의 연구가 나머지에 필요했습니다!

3

length() 또는 내가 큰 개체를 사용했습니다하지 않는 것이 octet_length()

10

큰 개체를 만들 때 크기를 저장하도록 응용 프로그램을 변경할 수 있습니다. 그렇지 않으면 같은 쿼리를 사용할 수 있습니다

select sum(length(lo.data)) from pg_largeobject lo 
where lo.loid=XXXXXX 
당신은 이전 게시물에 제안 큰 객체 API 함수는, 그들이 좋아 작동하지만 선택 방법은 위의 제안보다 느린 크기 순서입니다도 사용할 수 있습니다

.

+0

이것은 가장 깨끗한 해결책입니다. 감사합니다 – MarekM

+1

불행히도'pg_largeobject' 카탈로그는 PostgreSQL 9.0부터 공개적으로 접근 할 수 없습니다 : https://www.postgresql.org/docs/current/static/catalog-pg-largeobject.html. – ochedru

4
select pg_column_size(lo_get(lo_oid)) from table; 

크기 (바이트)를 제공합니다.

select pg_size_pretty(pg_column_size(lo_get(lo_oid))::numeric) from table; 
관련 문제