Optimizare delete cascade postgresql

Salut,
Am 2 tabele: log_session si log in postgresql. Cele 2 sunt legate prin FK. Tabela log a ajuns maricica si ca sa o pastrez intr-o marime controlabila la fiecare minut sterg logurile mai vechi de o ora. Cele 2 sunt cu delete cascade.
Dureaza aproximativ o secunda stergerea unei sesiuni cu tot cu logurile ei.
Cam ce as putea sa optimizez?
Cam asa arata un explain

Cât de mare e log_session ?

Nu e o idee bună să faci logurile la sesiuni așa. Se va duce prin tot log session-ul ca să caute ce intră-n interval.
Vezi cât durează să ștergi ceva direct cu un id.

Dacă vrei o bază de date pentru log-uri vezi redis, timescaledb, questdb, clickhouse…

Pai tabela cu log e cea mai grea. Ajunge si la 20GB. log session e micuta si are cateva zeci de MB.

1 Like

Ai putea partitiona tabelul la fiecare zi din log și să rulezi where pe partitia pe zi la log.

E o problemă complicată, redu numărul de elemente prin care rulează where-ul.

Totuși logurile stocate doar o oră nu văd ce avantaje aduc. Folosește direct redis sau syslog pentru ceva de genul.

1 Like

Logurile sunt mukt mai potrivite in formst fisier, cu log rotate activat. Ai un usecase mai deosebit de le vrei in baza de date? Retentia e suficient de mica incat sa pierzi lucruri importante.

O sa le scot din DB numai ca acum era foarte curios sa vad daca pot sa optimizez.
Acum am o problema cu loguri ca “sunt grele” , dar in mod sigur problema asta o sa apara in timp si pe alte tabele.

Am mai observat la query tau ca stergi cu subselect. Nu merge delete … from … where conditie_de_timp ?

2 Likes