Zbytečný dotaz do databáze v NDBT?

Polki
Člen | 553
+
0
-

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

Database Explorer po updatu refetchne řádek z databáze, aby aktualizoval ActiveRow aktuálními hodnotami. Viz https://github.com/…ctiveRow.php#L168

Polki
Člen | 553
+
0
-

To jsem si myslel taky, ale pořád mi to přijde zbytečné.
Přece pokud dělám dotaz na update, tak vím co tam posílám a nemusím pak dělat dotaz na to abych zjistil, co jsem tam vlastně poslal ne?

David Matějka
Moderator | 6445
+
+1
-

Když máš třeba triggery nebo update na základě nějaké sql funkce, tak nevíš.

A ty select jsou proti update skoro zanedbatelné.