Zbytečný dotaz do databáze v NDBT?
- Polki
- Člen | 553
Ahoj,
dělám si menší pokus v Nette 3 a narazil jsem na tuto zvláštnost.
provedu tento kód:
bdump($this->db->table('slovo')->where('sorted', '')->count('id'));
$dbRows = $this->db->table('slovo')->where('sorted', '')->limit(2500)->fetchAll();
foreach ($dbRows as $word) {
$value = $word->value;
$chars = $this->splitChars($value);
usort($chars, "strnatcmp");
$result = implode('', $chars);
$word->update([
'sorted' => $result
]);
}
bdump($this->db->table('slovo')->where('sorted', '')->count('id'));
Jak vidíte, vytáhnu si sloupce z DB, něco s nimi provedu a updatnu hodnotu v databázi. Co s nimi provedu není podstatné. Důležité je, že s ActiveRow $word pracuju jen na začátku cyklu a na konci. Žádné další čtení a nic podobného.
Počítal bych tedy, že výše uvedený kód provede pouze select kterým vytáhne 2500 záznamů z databáze a pak nad každým řádkem zacolá zvlášť update. Tedy 2501 dotazů.
Ovšem to jsem se spletl. Dotazů je 2× tolik, jelikož pro každý UPDATE udělá Nette ještě znovu SELECT.
Otázka je, proč se dělá ten select? Není zbytečný?
Obrázek dotazů je možné kouknout tady.
- nightfish
- Člen | 518
Database Explorer po updatu refetchne řádek z databáze, aby aktualizoval ActiveRow aktuálními hodnotami. Viz https://github.com/…ctiveRow.php#L168
- David Matějka
- Moderator | 6445
Když máš třeba triggery nebo update na základě nějaké sql funkce, tak nevíš.
A ty select jsou proti update skoro zanedbatelné.