These disk access issues are why no database I know of actually
stores large objects inline. It would be crazy to do so.
mysql, postgres, and oracle all have support for blobs, and
none of them store them inline.

(btw, if you care about disk io performance for blobs,
you can tune the fs parameters for such large files.)

blobs are a pain no matter how you cut it.

i've built different applications with them in the database,
and without (storing just filenames, with files maintained
by the app, as drh suggested).
I've regretted both approaches :(.

The problems I've seen with not using database blobs:

1. kiss replication goodbye. If you are careful with file naming,
and never modify blobs, and use rsync, you can just barely get by.

2. You can't do text matching as part of a sql request. You have
to do your own external text indexing and join at the app layer.

3. You have to implement your own application-level transaction logic,
so that during updates and deletes of both database and file system
are inconsistent. Except that is hard to do right, so over time
the two *will* get inconsistent.

4. You have to have a shared file system for your database clients.
Which means NFS or samba, or something else which is painful
to set up and administer and is difficult to secure over a WAN.

The problems I've seen with using database blobs:

1. The blob-specific APIs are also usually database-specific.
They are typically poorly designed.
Now with JDBC3/ODBC3, they are at least not database-specific....

2. The semantics of blob modification within a larger transaction
is usually poorly documented, or buggy, or both.

3. You don't get to play with the blobs in the external file
system when you want to (even if for read only purposes).

4. Performance can still stink, unless you are careful. At the
wire level, the fetch blocks usually only contain "locator"
objects, and these are converted to data streams only when
asked, and that usually requires a new independent roundtrip
and set up for every blob. So you end up doing things like
using sql functions which fetch the first 1000 bytes of the blobs
(if that is what your app wants), so that they are streamed with
the rest of the fetch.


-mda

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to