Doctrine performance (WHERE x IN (…))
- martinprihoda
- Člen | 8
Zdravím,
snažím se co nejvíce optimalizovat počet dotazů do databáze a poptávám nějaké alternativní řešení problému, kdy mi Doctrine interpretuje „WHERE x IN (:y)“ na takový počet SQL dotazů, který je roven velikosti pole vkládaného za „:y“.
V uvedeném příkladu jsou $categories ty kategorie, kam má uživatel v aplikaci přístup.
$qb = $this->questionDao->createQueryBuilder('q')
->leftJoin('q.category', 'cat')
->where('cat.mainCategory IN (:categories)')
->orderBy('q.updatedAt', 'DESC')
->setParameter('categories', $categories)
->getQuery()->getResult();
V praxi to může být až desítky kategorií tudíž vždy, když se dotazuji na nějaká data závislá na kategorii, dotaz se znásobí počtem kategorií, ke kterým má uživatel přístup. To je ve finále hodně nežádoucí, protože je to většina dat tahaných z databáze a na jedné stránce s velkým výpisem různých dat mám až 1400 dotazů, způsobených převážně tímto.
Měl bych k celému problému přistupovat uplně jinak? Když si vytáhnu všechny data z tabulky a pak se v php probublám u každého záznamu na jeho kategorii a ověřuji její existenci v $categories pak je počet dotazů úplně stejný, což je předpokládám způsobené lazy loadingem. Jak teda na to?
Děkuji za jakékoliv rady.
Martin
Editoval martinprihoda (3. 12. 2015 12:55)
- enumag
- Člen | 2118
Je to samozřejmě způsobené lazy-loadingem. Jedno řešení je uvést ty související entity co budeš potřebovat v select klauzuli té query. I to má sice jisté nevýhody, ale pořád je to mnohem lepší než lazy-loading.
Osobně nyní používám tohle řešení of Filipa Procházky: https://github.com/…y-objects.md. Je to vysvětlené na QueryObjectech ale v principu by to mělo jít použít i bez nich.
- Filip Procházka
- Moderator | 4668
Ahoj, koukni na tohle https://filip-prochazka.com/…del-posobota a pročti si docku https://github.com/…ster/docs/en :)