[BSD] Spam filter gyorsan és hatékonyan
Laszlo Nagy
gandalf at shopzeus.com
2009. Júl. 21., K, 16:39:51 CEST
Molnár Roland wrote:
> István írta:
>
>> jah foleg ha az adat tabla amibol kverizel nagyobb mint a memoria
>> ahova kesselhetnel
>>
>> bele se merek nezni milyen kverik futhatnak mert ha full table scanek
>> akkor inkabb haggyuk is ezt
>>
> Még mindig nem értem a problémád.
> Ha valaki SQL alapra helyezi bármely dolgát, előtte ép ésszel felméri mi
> kell hozzá és olyan vasra rakja. Abban igazad lehed, hogy sufni sql
> szerverek valóban tudnak lassúak is lenni, de a cache-ben tárolt adatok,
> akkor is ott vannak és van még egy plusz cache mechanizmusod a kernel
> filecache-elése fölött, így szerintem még mindig inkább nyersz vele.
> Az agyatlan SQL lekérdezések okozhatnak gondot, de nem hiszem, hogy egy
> ilyen publikus megoldást ne nézne át pár SQL-hez értő ember is és ne
> javítaná ki, ha gond lenne vele.
>
> Van tapasztalatod már az SQLGrey-jel, vagy csak az SQL irányában van
> ellenérzésed?
Na csak hogy én is beszóljak. :-) A gép amin ez megy egy kétprocis
nyolcmagos Xeon, 24 giga memóriával és tisztességes RAID-del (2GB write
back cache, BBU, 8 vinyó RAID 6 ban stb.) Ennek ellenére nem preferálom
az SQL-ben tárolást. Programozói szempontból nagyon kényelmes a
használata. De van amikor bazi lassú tud lenni. Mondjuk lehet hogy ez a
gép elbírná, de nem terhelem szívesen.
Élő példa: van egy táblánk amiben 4 millió sor van és van kb. 100
oszlopa. Egy sor mérete általában több kilobyte. Név szerinti keresés
SQL-ből nem megy jól a következők miatt:
- seq scan nyilván rossz, minek végignyalni az egész táblát ha csak
néhány (kis) mezőben keresünk
- index scan csak akkor jó ha pont azokban a mezőkben keresünk amikre az
index van. De változatosak a keresések és nem hozhatok létre sok nagy
indexet, mert akkor meg az update-ek lesznek lassúak (meg egyébként is
kis/nagybetű érzékenység meg egyéb problémák miatt szinte sose használna
index scan-t)
- tsearch2 jó lenne, kivéve hogy kipróbáltuk és a tsearch2 index file
mérete olyan bazi nagy lett hogy szintén lassú, valamint mivel bazi nagy
az index file ezért a tábla update-elése lehetetlenül lelassult -> ötlet
eldobva
Helyette az van, hogy szöveges állományba exportálunk ki olyan rész
adatbázisokat, amik csak bizonyos kategórián belül tartalmaznak néhány
adatot, megfelelő módon konvertálva (kisbetűs, csak azok az oszlopok
amiket keresünk stb.) és C-ben van írva hozzá egy program ami adott
kategórián belül az adott file-t beolvassa EGYSZER és csinál egy
kimenetet. Igaz hogy nem "live" keresés, mert közben az eredeti
adatbázis változhat, de erre szerencsére nincs is szükségünk. Viszont
marha gyors: lemezről szekvenciális read egy kisebb állományra, és mellé
egy kis processzorigényű számítás. Szinte semmi memóriát nem eszik, és
akkor is gyors ha a beolvasandó file nincs a cache-ben (read buffer size
átállítva 2MB-ra, nincs is szükség cache-re...) Ha valaki odáig
vetemedik hogy az összes 4 millió termékben akar keresni néhány
kulcsszóra, akkor is végez 2-3 sec alatt ami azért nem semmi. :-)
Ebből is látszik, hogy vannak dolgok amire az SQL az ágyúval verébre.
Meg persze vannak olyan helyzetek is amikor nem lehet elkerülni, ha
group by-os subselect-es bonyolult lekérdezést kellene from-the-scratch
írnom akkor belehalnék. :-)
Igaz hogy nem próbáltam az sqlgrey-t de a probléma jellege (miszerint
csak egyetlen adattábla van és abban is csak 3 oszlop) azt sugallja hogy
SQL használata fölösleges overhead. Hmm ha esetleg az sqlgrey-nek van
valami extra funckiója amire nekem nagy szükségem van, akkor meggondolnám.
Üdv,
Laci
További információk a(z) BSD levelezőlistáról