contributte/datagrid – limit počtu výsledků

MikKuba
Člen | 83
+
0
-

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
+
+2
-

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
+
0
-

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
+
+2
-

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 :)