pgsql, sqlite, mysql

Egy való életből adódó, erőforrásigényes adatbázis-lekérdezési feladatot szerettem volna megoldani a gépemen.

Adott egy 21504509 és egy 450318 soros (soronként 80-90 karakteres, 17 oszlopot tartalmazó) csv fájl,
méretileg nézve 1.7GB és 27MB, amely két táblát reprezentál. E két tábla fejhasználásával zajlik néhány jó durva lekérdezés, melyben igen kemény, sokoszlopos join-ok (és "where not exists..." részek, azaz anti-joinok) vannak, megfelelő indexek nélkül. (Az indexek létrehozása időigényesebb lenne, mint az egész folyamat, úgyhogy maradtam az indexmentes változatnál; nem is beszélve az indexek durva helyigényről, amit inkább nem vállaltam.)

Az összehasonlításban meglepően szép helyet ért el az sqlite. Döbbenetesen profi munkát végeztek a fejlesztők.

pgsql9.1: 22 perc
sqlite3: 50 perc
mysql5.5: 2 óra alatt sem volt értékelhető eredmény, még az első lekérdezésben sem, ami pedig az sqlite-nak is megvolt 20 perc alatt.

Az Oracle 11g R2 alatti eredményt csak emlékeimből tudom előhalászni, az is egy órán túl mozgott.

Tulajdonképp arra voltam kíváncsi, hogy egy olyan lekérdezéssel, ahol nincs explicite megadva a join mikéntje, csak egyszerűen "where exists..." és "where not exists..." részek szerepelnek, ki mit kezd. Az adatbáziskezelőnek kellett kitalálni az illesztési módszert, és többnyire hash join adódott. Valahogy az sqlite kis méretéből adódóan valóban nagy sebesség jött ki. Tényleg ül a szlogenjük: Small. Fast. Reliable. Choose any three.

A PostgreSQL kiválósága persze nem is igényel indoklást -- mindig is azt szerettem legjobban. :-)

Mindehhez egy Amazonos virtuális gépet kellett használnom; viszonylag combosat. A 8GB-os nem volt elég, muszáj voltam xlarge-ot (16GB-osat) lábra állítanom. Úgyhogy a fenti számok forintban is mérhetőek.

Nyilván ez egy spéci helyzet mérése, de számomra mégis mérvadó az eredmény. S aki apró-cseprő munkáihoz még nem barátkozott meg az sqlite-tal, annak nagyon ajánlom.

Hozzászólások

+1 az sqlite-nak, sokszor olyan (akkora) dolgokra is a legjobb valasztas, amit soha nem gondolna az ember.

Eszközkészlet, egyszerű telepítés. Pl. mi a halálnak kell Windows alatt neki külön user? Miért nem tud NETWORK SERVICE alatt futni? Nem lehet neki a telepítéskor megadni, hogy milyen user neve alatt fusson. Kényelmetlen. Régebben nem is volt natív Windows-os telepítő. Nem fejlesztőbarát, na.

Csak azert, hogy kiprobaljam, es esetleg megnezzem mit tud, nem fogok 8 orat szenvedni a telepitesevel. Ha MAR tudom, hogy jo minosegu, akkor persze el fogok ezzel tolteni idot. De amit meg szeretnem tanulni meg ismerni, esetleg felmerni, hogy jo-e a celjaimnak, akkor ne gorditsenek akadalyokat elem a nehezkes telepitessel. En akarom megismerni oket, es ha az elso talalkozas az, hogy hat ez nehezkes, akkor koszonom, nem kerek belole. Jo bornak is kell ceger.

Arrol van ugye szo, hogy 15 ev alatt nem ert el nepszeruseget a Postgres. Namarmos, 8.1-ig Windows alatt nem volt unicode supportja.
A 8 elotti verziokhoz cygwint kellett kulon telepitened, mert nem volt nativ Windows tamogatasa. Emiatt volt sokkal hasznalhatobb alternativa Windwos alatt a MySQL es nem terjedt el. Elismerem, az utobbi idoben nagyot javult a Windows tamogatasa a PostgreSQL-nek, de a kezdeti 10 ev rossz tapasztalatai miatt az emberek mar masra szoktak ra.

Ha GIS alkalmazas kell, kulon kell telepitened a PostGIS kiegeszitot hozza, mig MySQL eseten alapertelmezetten tamogatottak ezek az adattipusok.

A hosting oldalakon is van PostgreSQL? Esetleg azokat erdemes megkerdezni, akik a hostingot uzemeltetik. Hiaba a Linuxos apache, ha a szolgaltato csak MySQL-t ad hozza. Nezzunk meg egy modern magyar szolgaltatot:
https://hu.dotroll.com/services/hosting/pro
Ok is csak MySQL-t szolgaltatnak.
Vagy egy meg komolyabb szolgaltatot: http://doclerweb.hu/tarhely
Itt is csak MySQL van. Igy aztan a CMS-ek sem torik magukat a plusz munkaval. Minek?

Eszkozkeszlet: pgAdmin III. Kenyelmes, mukodik, PHPMyadminhoz kepest eg es fold (pedig utobbit eleg sokan hasznaljak).
Telepites: apt-get install csomagnev ugyanugy muxik
Win alatt meg felmegy .msi-bol, de korabban volt valami wizard is. Ha sajat feljesztesu programhoz akarod mellekelni, csinalsz egy NSIS telepitot. (elozo munkahelyemen epp az en feladatom volt, a master-slave telepito kisse megizzasztott, de a sima tenyleg nem volt nehez)
.msi egyebkent parameterezheto, ha jol emlekszem, usernevet is lehetett allitani akkoriban (8.4), de erre pont nem volt igeny.
Az meg, hogy nem fejlesztobarat, szerintem nem igaz. Miutan megismerkedtem vele, az itthoni projecteket atirtam MySQL-rol PG-re, mert ez volt az elso igazan kenyelmes DB a kezeim kozt (az emlitetteken kivul Oracle volt meg, na azt tenyleg halal telepiteni).

Egyebkent kenyelmes hasznalni (fejleszteni ra), jol dokumentalt, es sebessegben is jol teljesit.

--
ezt tényleg ennyire nem értitek? - turdus :)

[flame]Mindig nevethetnékem támad, mikor meghallok ilyet, hogy PHPMyAdmin... Gyakorlatilag csak adminolásra nem alkalmas. Nade...[/flame]

PgAdmin jó cucc az tény (bár egyeseket zavar, hogy mindent külön ablakba nyit, bár engem nem, sőt), azonban miután kellett dolgoznom az MSSQL Management Studioval, azért azt kell, hogy mondjam, bőven van hova fejlődnie. Pl. auto complete az általam jelenleg használtakhoz képest vicc (MSSQL Mgmt Std, HeidiSQL, PgAdmin), és lehetne benne néhány monitorozáshoz használható cucc. Vagy pl. még bizonyos apróságok, pl. listák legyenek már rendezhetőek a statisztika ablakban. Szóval azért van még hova fejlődnie a tool támogatottság terén jócskán.

Ettől függetlenül ha a feladat nem kíván kifejezetten mást, én is a Pg-t favorizálom.

----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™

Nem tudom hol zavar bármit is _fejlesztőként_ az, hogy külön user kell neki. Másrészt ez nem tudom miért hátrány, főleg annak tükrében nem, hogy sokan kifogásolják Windowson, hogy miért minden SYSTEM/akármi user nevében fut.

(Régen, amúgy mintha lehetett volna, igaz 8.3 vagy 8.4 óta másféle telepítő van...)

----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™

Indexek nélkül miért is tetszik csodálkozni?!