Csalóka az adatbázis. Sokan félreértik, mire való, és a 90-es évek stílusában minden vackot rábíznak, ettől persze megfekszik szegény. A félreértés onnan ered, hogy az MS akkor azt mondta, spben kell megírni az üzleti logikát (mivel a VB használhatatlan volt, a C++ meg a legtöbb ember kezében csak bug gyártásra jó). A Delphi ezért élte a fénykorát.
Na szóval, amikor szegény dbre sok üzleti logikát bíznak, akkor mivel őbenne nem lehet a hagyományos módon cache-elni mint egy appszerveren, így az összes piszlicsáré, a büdös életben nem változik de legyen a dbben mert az jó adatot is táblákból kell kiolvasni. Pl. az enumok értékét, amit azért nem szoktunk megváltoztatni a dbben, mert ehhez úgyis a programozott enum értékeket is át kéne írni, ráadásul a kettőt egyidőben szinkronban.
Így aztán a tízmilliós vasú SQL Server olyan dolgokon dolgozik, ami nem az ő feladata. 1 lapolvasás nem a világ, és különben is memóriában vannak a pici táblák, nem jelent ez nagy terhelést.
Valódi cacheből, appszerveren felolvasni egy pl. egy stringet pár nanonsecundum.
Nézzük meg ezt SQL Serveren belülről:
declare @i int = 1000000, @a varchar(200) while (@i > 0) begin select @a = s.Value from Setting s where s.Name = 'TestSetting1'; set @i-=1; end
A Setting tábla két soros, és rendes voltam, raktam clustered indexet a Name oszlopra. 15mp-ig tart a ciklus, a select nélkül kevesebb, mint 1 mp (kb. 800 millisec).
Azaz a select általi kiolvasás kb. 15us, míg ugyanez az appszerveren nanosec nagyságrendű. Nem mindegy.
Ha már ennyire szerelmesek vagyunk az adatbázisba, akkor még azt meg lehet tenni, hogy paraméterként adjuk át neki ezeket a well-known beállításokat.
Pl.
create proc Teszt1 as declare @a varchar(200) select @a = s.Value from Setting s where s.Name = 'TestSetting1'; go create proc Teszt2 @par varchar(200) as declare @a varchar(200) = @par go declare @i int = 1000000, @a varchar(200) while (@i > 0) begin exec Teszt1; set @i-=1; end go declare @i int = 1000000, @a varchar(200) select @a = s.Value from Setting s where s.Name = 'TestSetting1'; while (@i > 0) begin exec Teszt2 @a; set @i-=1; end
28 vs 12 mp, látszólag nem nagy deal, de egy terhelt szervernél minden gramm számít.
Ps. sok cégnél láttam ilyeneket, senki ne vegye magára.