mff-uk / odcs

ODCleanStore
1 stars 11 forks source link

Optimize Hibernate queries #487

Closed tomas-knap closed 10 years ago

tomas-knap commented 10 years ago

Nevim jestli na Honzu, ale zatim pracovne.

Honza: Pre zaujimavost posielam v prilohe, ake dotazy sa volaju pri jednom requeste, ked sa oznaci pipeline execution a nacitavaju sa logy. Su tam naozaj brutalne joiny cez takmer celu databazu, a akoby nestacilo, nacitavaju sa niekolkokrat aj rovnake objekty. Celkovo je tam 128 komplexnych dotazov, a zalogovalo mit to cca 2MB. To je dost brutalne. Na nic moc som neprisiel, ale vyzera to akoby addon vaadin-lazyquerycontainer ktory pouzivame volal vsetky tieto veci. Myslim, ze by to zvladlo aj viac dat, pretoze vyzera ze nacitava len to co sa zobrazi na vybranej stranke. Problem je ze tam nacitava kazdy riadok zvlast a k tomu este rekurzivne vsetky atributy. Miestami mame nastaveny eager loading na atributy, ale kontroloval som to, a cez eager loading sa z PipelineExecution nema ako dostat na veci ktore tam zbytocne nacitava. Je to divne. Pre istotu som aj skusil vsetky EAGER anotacie zrusit, ale aj tak dotazy boli podobne komplexne a pomale. Bohuslav tam pisal dost kodu k tomu LazyQueryContaineru, mozno by mohol tusit kde je problem.

Bohuslav: Co se týče těch queries, tak mi opravdu přijdou složité a zmatené, ale zatím moc netuším v čem je problém. Koukal jsem na query ostatních věcí, na které nepoužíváme LazyQueryContainer a nepřijdou mi o moc lepší. V příloze "scheduler_queries.txt" je výpis z logu po odkrokování metody getAllSchedules() na ScheduleFacade. Vrátí 2 výsledky a má 1041 řádků. Příloha "exec_monitor_query.txt" je výpis z logu po odkrokování metody loadItems() z IntlibQuery, která je volaná pro získání execution záznamů pro monitor. Vrátí 16 výsledků a má 8467 řádků.

Po zavolání query.unwrap(org.hibernate.Query.class).getQueryString(); je výsledkem: "select generatedAlias0 from PipelineExecution as generatedAlias0 where ( 0=1 ) or ( 1=1 ) order by generatedAlias0.start asc"

Tedy můj předběžný závěr je, že LQC negeneruje žádné šílené query, tohle už je standardní hibernate TypedQuery a za vším stají hibernate.

tomas-knap commented 10 years ago

See: https://grips.semantic-web.at/display/LOD2/Developer+Notes We will use lazy loading and EclipseLink as JPA provider

janvojt commented 10 years ago

EclipseLink is currently implemented by commit 4dfbfa99. Application runs noticeably faster than before, but there is still big room for improvement. I am closing this issue, new issues will be created for further optimizations.

tomas-knap commented 10 years ago

Optimize lazy loading. When pipeline exec needs user, it loads pipeline and user details for each exec record

tomas-knap commented 10 years ago

Will be solved by #702