Dávkové zpracování SQL dotazů v Doctrine
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Martk
- Člen | 661
Dnes dopoledne jsem se trošku nudil a napadla mě jedna ďábelská myšlenka: zpracování několik SQL dotazů v doctrině naráz. Vyzkoušel jsem si to naprogramovat a bez hacků (celkem 2, přístup k privátním metodám třídy, kvůli lenosti) se to neobešlo, ale ve výsledku se mi to podařilo. Teď k diskuzi, jaké zápory má tohle zpracování nebo co si o tom celkově myslíte?
Zajímavost pod čarou:
Naměřená rychlost (testováno nad 50 SQL dotazy):
- Jednotlivě mysql: ~ 17 ms celkem (php + mysql): ~ 39 ms
- Dávkově mysql: ~ 0.9 ms celkem (php + mysql): ~ 23 ms
PHP kód:
timer();
for ($i = 0; $i < 50; $i++) {
$this->em->getRepository(Gallery::class)->createQueryBuilder('e')->where('e.id = ?1')->setParameter(1, array_rand($pairs))->getQuery()->getResult();
}
endTimer();
timer();
$collection = new QueryCollection();
for ($i = 0; $i < 50; $i++) {
$collection->addQuery((string) $i,
$this->em->getRepository(Gallery::class)->createQueryBuilder('e')->where('e.id = ?1')->setParameter(1, array_rand($pairs))
->leftJoin('e.images', 'i')->addSelect('i')
->getQuery()
, TRUE);
}
$result = $collection->exec();
endTimer();
Pokud někdo chce, tak můžu kód sdílet na gitu.