Hallo,
ich habe eine eigene Twig-Funktion gebaut, die Unterkategorien aus der Datenbank ausliest. Wir haben über 100.000 Kategorien auf bis zu 5 Hierarchie-Ebenen.
Die Funktion sieht so aus:
public function getSubCategories(SalesChannelContext $salesChannelContext, string $parentId)
{
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('parentId', $parentId));
$criteria->addSorting(new FieldSorting('name', FieldSorting::ASCENDING));
$criteria->addState(Criteria::STATE_ELASTICSEARCH_AWARE);
$context = $salesChannelContext->getContext();
$subCategoryRepository = $this->categoryRepository->search($criteria, $context)->getEntities();
return $subCategoryRepository;
}
Die Twig-Funktion wird je nach Hierarchie-Ebene bis zu 20.000 mal aufgerufen. Ich weiß, das ist extrem, aber in SW5 hat das super geklappt, sobald die Seite einmal in den Cache geladen war. Da war die Ladezeit dann ca. 4 Sekunden (Für uns absolut akzeptabel für die Datenmenge).
In SW6 performt die Seite trotz aktiviertem Cache übel: 19 Sekunden.
Ich habe elasticsearch aktiviert und auch redis als cache. APP_ENV=prod
SW-Version: 6.5.8.7
Ich hab schon mit redis und redis_tag_aware getestet. Macht auch keinen Unterschied:
framework:
cache:
#app: cache.adapter.redis_tag_aware
app: cache.adapter.redis
default_redis_provider: 'redis://redis:6379'
Ich hab auch versucht, die Daten direkt aus der DB zu ziehen:
$connection = \Shopware\Core\Kernel::getConnection();
$languageId = $salesChannelContext->getContext()->getLanguageId();
$sql = 'SELECT hex(c.ID) as id, t.name
FROM
category c
inner join category_translation t on t.category_id = c.id
where hex(c.parent_id) = "'.$parentId.'"
AND hex(t.language_id)="'.$languageId.'"
ORDER BY t.name';
$A_categories = $connection->executeQuery($sql)->fetchAll();
return $A_categories;
Aber auch das bringt keinen Performance-Gewinn.
Und ich hab probiert, alle notwendigen Daten aus der DB in einem einzigen SQL zu holen, so dass ich die Twig-Funktion nur einmal aufrufen müsste, aber da die Abfrage in der mySQL Workbench schon 41 Sekunden braucht, habe ich den Ansatz auch wieder verworfen.
Mir fällt langsam nix mehr ein
Kann ich irgendwo am Cache noch was einstellen oder optimieren?
In SW5 hatte ich das Gefühl, dass die Seite an sich in den Cache geladen wurde. In SW6 erscheint mir das alles sehr granular mit den verschiedenen Caches und funktioniert scheinbar - zumindest in meinem Fall - nur suboptimal.
Bin für jeden Tipp dankbar.