From: | Chris Browne <cbbrowne(at)acm(dot)org> |
---|---|
To: | pgsql-general(at)postgresql(dot)org |
Subject: | Re: Storing images in PostgreSQL databases (again) |
Date: | 2006-10-05 15:01:22 |
Message-ID: | 608xjuhkn1.fsf@dba2.int.libertyrms.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
marco(dot)bizzarri(at)gmail(dot)com ("Marco Bizzarri") writes:
> Hi.
>
> I can provide some "insight" on the difference between the two interfaces.
>
> AFAIK, the difference is in size of the file you can store, and in the
> interface you have when you want to access.
>
> The size is not important (I think), since you are far below the limit.
>
> For the interface, the bytea gives you a "query" based interfaces,
> while largeobject are able to provide a file based interface.
>
> With Large Object, you can avoid reading the whole object with one
> read, or you can even move inside the Large Object, which can be
> useful if you have large files stored.
>
> I think there are differences also in how the space is reclaimed, but
> my PostgreSQL - Fu stops here.
That seems a reasonable explanation...
There is another thing that is worth observing for the "store data as
an ordinary column" idea...
Very Large Columns are stored in what is called a TOAST table.
Consider the following table:
tbig(at)[local]:5832=# \d foo
Table "public.foo"
Column | Type | Modifiers
----------+---------+--------------------------------------------------
id | integer | not null default nextval('foo_id_seq'::regclass)
name | text |
contents | text |
Indexes:
"foo_pkey" PRIMARY KEY, btree (id)
tbig(at)[local]:5832=# vacuum verbose foo;
INFO: vacuuming "public.foo"
INFO: index "foo_pkey" now contains 3 row versions in 2 pages
DETAIL: 0 index pages have been deleted, 0 are currently reusable.
CPU 0.00s/0.00u sec elapsed 0.00 sec.
INFO: "foo": found 0 removable, 3 nonremovable row versions in 1 pages
DETAIL: 0 dead row versions cannot be removed yet.
There were 12 unused item pointers.
0 pages are entirely empty.
CPU 0.00s/0.00u sec elapsed 0.00 sec.
INFO: vacuuming "pg_toast.pg_toast_113203"
INFO: index "pg_toast_113203_index" now contains 54 row versions in 2 pages
DETAIL: 0 index pages have been deleted, 0 are currently reusable.
CPU 0.00s/0.00u sec elapsed 0.00 sec.
INFO: "pg_toast_113203": found 0 removable, 54 nonremovable row versions in 14 pages
DETAIL: 0 dead row versions cannot be removed yet.
There were 5 unused item pointers.
0 pages are entirely empty.
CPU 0.00s/0.00u sec elapsed 0.00 sec.
VACUUM
tbig(at)[local]:5832=# select id, name, length(contents) from foo;
id | name | length
----+-------+---------
1 | file1 | 1860342
2 | file2 | 1860342
3 | file3 | 1860342
(3 rows)
The "contents" columns contain 1.8MB of data.
Note that if you run a query that doesn't access the "contents"
columns, they never get drawn in. What the table 'physically' looks
like is rather like:
id | name | toast pointer
----+-------+--------------
1 | file1 | 1341234
2 | file2 | 3241341
3 | file3 | 3421892
[where those pointers point into the "toast" table].
You can get decent efficiency out of that...
--
(reverse (concatenate 'string "ofni.sesabatadxunil" "@" "enworbbc"))
http://cbbrowne.com/info/linuxdistributions.html
"...[Linux's] capacity to talk via any medium except smoke signals."
-- Dr. Greg Wettstein, Roger Maris Cancer Center
From | Date | Subject | |
---|---|---|---|
Next Message | Scott Ribe | 2006-10-05 15:12:23 | Re: Generating synthetic keys on copy |
Previous Message | Merlin Moncure | 2006-10-05 14:58:00 | Re: Storing images in PostgreSQL databases (again) |