2012-02-12 19 views
0

PostgreSQLで大きなオブジェクトのサイズを直接取得する機能がないのはなぜかと思います。私は1つがseek()オブジェクトの末尾にできると信じてtell()しかし、それはあまりにも高価ではない?私はGoogleでそれについての情報を見つけることができないのですか?たとえば、オブジェクトのサイズを取得する適切な方法は何ですか? Content-Sizeのhttpヘッダーを入力したい場合は、PostgreSQLでのオブジェクトのサイズの取得

答えて

6

この機能を使うと、データとそれを試してみたいことがあり、私のために十分な効率的なされています:

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 9.0に抑制されていると思いpg_largeobjectへの読み取りアクセスが必要です+非スーパーユーザーの場合

+1

私はまた、長さ(データ)メソッドを使用することが、シークと発言よりもかなり遅いことを証言します。少なくとも私の8.4、370レコードで、sum() - 30秒、オープン/シーク - 1秒を使用しています。ありがとう、ダニエル。 –

関連する問題