contributte/datagrid – limit počtu výsledků
- MikKuba
- Člen | 83
Ahoj,
Po čase používání datagridu jsem narazil na problém s rychlostí
načítání a vlastně jakéhokoliv úkonu v gridu.
Databáze narostla už do velkých rozměrů a z databáze se vytahuje okolo
10 000 záznamů (a tempo jakým počet záznamů přibývá spíš roste) a
momentálně už trvá mnoho sekund, než se stránka vůbec načte.
Pro představu z 27 (!!) sekund načítání stránky je třeba 24 sekund jen
volání SQL.
Moje funkce pro naplnění gridu volaná z
$grid->setDataSource($this->getModel());
je potom SQL dotaz
s 2 JOINy a jednoduchými podmínkami, seřazení a groupování podle
parametru.
Jenže zde úplně chybí nastavení limit a offset. Z GET parametru bych ještě dokázal zjistit, jaká je aktuálně stránka a podle toho to nastavit, jenže grid umožňuje si zvolit zda chci vypisovat 30, 50 anebo 100 řádků. A tuto informaci se mi nedaří z gridu dostat (ještě před samotným zavoláním SQL dotazu).
Je na toto prosím nějaké udělátko, anebo nějaký osvědčený způsob, jak tento problém vyřešit?
Předem moc díky!
- Pavel Kravčík
- Člen | 1195
Problém bude spíš v tom konkrétním dotazu, jestli v něm náhodou
nemáš něco jako fetchAll()
?
Máme to třeba na historii bankovního účtu (500k+ řádek) a funguje za 100ms (při třeba 30 záznamů per page).
- Pavel Janda
- Člen | 977
Určitě pomůže optimalizace SQL query. Pokud by byl problém v dotazu na count(), doporučuji udělat si vlastní data source s úplně custom count() query. Občas jsem to tak dělal, když jsem potřeboval dostat count() nějakým optimálnějším způsobem.
- MikKuba
- Člen | 83
Díky za navedení, nakonec pomohlo to, že jsem
return $this->db->query(...)->fetchAll();
(kde byly asi 3× LEFT JOIN a potom několik podmínek, groupování a
order)
přepsal na
return $this->db->table(...)->select(...)->where(...)->order(..)->group(..);
A funguje to bravurně, naprostá rychlost! :)
Spolu s úpravou ještě 2 filtrů a funkcemi pro ně, které už nebyly
potřebné jsem celý kód zredukoval o několik řádků a výrazně to vše
zpřehlednil, takže bomba :)