skvělé a co když potřebuješ mít statistiku třeba za měsíc stažená data a zákazník je připojen 50 dnů tak to nespočítáš z té tabulky....
To mas pravdu... Ale to nespocitas rozumne ani z radacct, ked do nej narves interim updaty ako samostatne zaznamy. V interim update ti (za normalnych okolnosti) nepride z NASka delta (rozdiel dat oproti poslednemu pocitadlu), ale aktualna hodnota pocitadla (od zaciatku session). Ked budes interim updaty insertovat, budes mat tie iste prenesene data ulozene v radacct viackrat. Okrem toho, ak si to nejak v tej tabulke neosetris (nad ramec vychodzieho nastavenia), budu mat vsetky zaznamy rovnaky AcctStartTime aj AcctStopTime, budes tam mat popretekane pocitadla, a bude z toho taky gulas, ze z toho velmi tazko spocitas spravny vysledok. A v neposlednom rade to bude nenormalny zahul na hardware - pre 1000 userov a 5-minutovy interim interval to vychadza na viac ako 105 milionov zaznamov za rok. Pre kontrolu viacnasobnych prihlaseni je potrebny select z tejto tabulky, pre spocitanie prenesenych dat tiez - obavam, sa, ze bezny hardware toto neunesie. Tudy cesta nevede. Ak by si si bol ochotny nechat poradit, ako to bude fungovat a bude to efektivne:
V prvom rade si vyries prenos celych pocitadiel (problem s pretekanim) cez GigaWords, bez toho to sa dalej neda pohnut. Pre dalsie vypocty potrebujes mat kompletne pocitadla, nie osekane. (Ak sa nemylim, 32-bitove pocitadlo pretecie pri plne vytazenej 100 Mbps linke za cca 5 minut.)
Na statistiku prenesenych dat si potom sprav dalsiu samostatnu tabulku, podla toho ako tie data chces mat evidovane pre dalsie pouzitie. My samostatne evidujeme prenesene data za kazdy den za kazdeho usera, a rozlisujeme silnu a slabu prevadzku (8-24h vs. 0-8h), takze mam v tejto tabulke stlpce s vyznamom - userid, datum, down_silna, up_silna, down_slaba, up_slaba. Mozno ti bude stacit aj jednoduchsia tabulka.
Potom si na tabulku radacct zaves v SQL trigger, napriklad takyto
CREATE TRIGGER radacct_update_acccounter_trig AFTER UPDATE ON public.radacct FOR EACH ROW EXECUTE PROCEDURE radacct_update_acccounter()
a vytvor si v databaze funkciu radacct_update_acccounter(). Tato funkcia bude zavolana databazou pri kazdom interim update, aj pri ukonceni session. V tejto funkcii bude mozne pristupovat k poslednej hodnote pocitadla (ulozenej v databaze) aj k novej hodnote (ktora prisla v interim update). Z tychto dvoch hodnot sa tu vypocita delta (rozdiel), a tato sa pomocou update pripocita k prislusnemu riadku v tvojej tabulke. Ak update nezmenil ziadny zaznam, pocitadlo pre tohto usera pre tento den neexistuje, a spravi sa insert - vytvori sa zaznam pre tento den.