Pokud se soubor na disku nikdy nepřepisuje, tak to musí příšerně fragmentovat soubory, do jejichž vnitřku se často náhodně zapisuje (třeba databáze). Jak se to řeší?
IMHO pro db mas pouzivat raw device, nebo co nejprimitivnejsi filesystem (jak jiz nekdo zminoval, treba ext2, tzn. neco bez journalovani).
Filesystem primarne slouzi k jinym ucelum, kde typicka operace je otevrit soubor, potencionalne presun na nejakou pozici (ale krome EOF znacne netypicky) a nasledny zapis/prepis az do konce filu. Tady u ZFS fragmentovani prilis nehrozi.
IMHO jsou pro databaze velmi vhodne extent-based filesystemy. To jsou takove, ktere soubor popisuji jako pole ukazatelu na extenty. Extent je velke mnozstvi po sobe nasledujicich diskovych bloku. Takze potom staci (v idealnim pripade ;-) rict, ze soubor zacina na disku na bloku cislo x a je y bloku dlouhy. A to jsou veskera potrebna metadata. Samozrejme, ze v realu to potom zdegeneruje na pole ukazatelu, navic je pro takovy filesytem nevyhodne, pokud ma prilis plny disk, pripadne pokud se na disku jiz nevyskytuji dostatecne dlouhe extenty. Pokud se ale databaze chova tak, ze si na zacatku naalokuje velky soubor, ve kterem pak operuje, je tento pristup vyhodny. Nastesti se tak vetsina databazi skutecne chova :-). V Oracle jde i nastavit, po jakych kusech se ma ten soubor zvetsovat, pokud zacne dochazet misto. Tusim, ze default tam byl kdysi neco kolem 20 MB, ale nevim, jak to DB admini nastavuji dnes.
Naopak se pro databaze nijak zvlast nehodi tradicni unixove filesystemy zalozene na konceptu inodu. A mam pocit, ze takovym systemem je i ext2. (Kdyz tak mne prosim opravte.) Tento druh filesystemu byl pro zmenu vyvinut pro "normalni" praci ;-).
Ja bych to rekl takhle: Filesystem je specializovana implementace databaze. Je specializovana na konkretni typy ulozenych dat ("soubory") a konkretni operace ("open, creat, ...").
Psat databazi nad databazi (tj. DB, ktera pracuje nad vrstvou filesystemu) je proto povetsinou blbost. A stejne tak je povetsinou blbost pouzivat obecnou DB jako filesystem (select obsah_souboru from tabulka where jmeno_souboru='...' apod.).