Catalog Price Rule Indexer im Detail: Wie automatische Rabatte berechnet werden
AI generated
M2
di.xml
Magento 2 · Catalog · Indexer
Catalog Price Rule Indexer im Detail: Wie automatische Rabatte berechnet werden
Warum Catalog Price Rules über den Index laufen, wie der catalogrule_rule-Indexer Preise vorberechnet, und welche Reindex-Strategien bei vielen aktiven Regeln helfen

Catalog Price Rules wirken auf den ersten Blick wie Cart Price Rules, nur ohne Gutscheincode, funktionieren intern aber vollkommen anders. Während Cart Price Rules ihre Bedingungen bei jeder Warenkorb-Berechnung neu auswerten, verlässt sich Magento bei Catalog Price Rules bewusst auf eine vorberechnete Indextabelle, damit die Preisanzeige im Katalog nicht bei jedem Seitenaufruf komplexe Regel-Logik durchlaufen muss. Dieser Artikel geht in die Tiefe: wie der catalogrule_rule-Indexer arbeitet, warum viele aktive Regeln bei großem Katalog zum Performance-Problem werden können, und mit welchen gezielten Reindex-Strategien sich das in Grenzen halten lässt.

12 Min. Lesezeit Catalog Price Rule Indexer Performance Reindex

1. Index versus Runtime: der fundamentale Unterschied zu Cart Price Rules

Cart Price Rules, also Warenkorb-Preisregeln mit oder ohne Gutscheincode, werden bei jeder Warenkorb-Berechnung live ausgewertet: Der Validator prüft die Bedingungen jeder aktiven Regel gegen den aktuellen Warenkorbinhalt und wendet passende Aktionen in Echtzeit an. Das ist möglich, weil ein Warenkorb naturgemäß klein ist, meist wenige bis einige Dutzend Positionen, sodass die Regelauswertung pro Request vertretbar bleibt.

Catalog Price Rules dagegen betreffen potenziell den gesamten Produktkatalog gleichzeitig, sichtbar auf jeder Kategorieseite, jeder Produktseite und in jedem Preisfilter der Layered Navigation. Eine Live-Auswertung sämtlicher aktiven Regeln gegen jedes einzelne angezeigte Produkt bei jedem Seitenaufruf wäre bei tausenden Produkten schlicht nicht performant genug, weshalb Magento hier bewusst auf Vorberechnung statt Runtime-Auswertung setzt.

2. Wie der catalogrule_rule-Indexer arbeitet

Der Indexer mit der ID catalogrule_rule iteriert über alle aktiven Catalog Price Rules und ermittelt für jede Regel die zugehörigen Produkte über deren Bedingungen, etwa Kategoriezugehörigkeit oder Attributwerte. Für jede Kombination aus Produkt, Kundengruppe, Website und Gültigkeitszeitraum berechnet der Indexer den resultierenden Regelpreis und schreibt das Ergebnis in die Tabelle catalogrule_product_price, versehen mit einem Gültigkeits-Zeitraum, innerhalb dessen der berechnete Preis unverändert gilt.

Ändert sich innerhalb des Gültigkeitszeitraums einer Regel nichts an den beteiligten Produkten oder Bedingungen, bleibt der vorberechnete Zeitraum in einer einzigen Zeile bestehen. Ändert sich hingegen etwa der Prozentsatz des Rabatts zu einem bestimmten Datum durch eine zweite, zeitlich versetzte Regel auf dasselbe Produkt, entstehen mehrere Zeilen mit jeweils eigenem Gültigkeitsfenster, wodurch die Zeilenanzahl in catalogrule_product_price mit der Anzahl zeitlich gestaffelter Regeländerungen pro Produkt wächst.


# Status und Modus des Catalog-Rule-Indexers prüfen
bin/magento indexer:status catalogrule_rule
bin/magento indexer:show-mode catalogrule_rule

3. Wie die Preisanzeige die vorberechneten Regelpreise nutzt

Die eigentliche Preisanzeige greift nicht direkt auf catalogrule_product_price zu, sondern über den Preisindexer catalog_product_price, der beim Aufbau der finalen Preisindex-Tabellen catalog_product_index_price die vorberechneten Regelpreise für das jeweils aktuelle Datum berücksichtigt und mit regulären Preisen sowie eventuellen Sonderpreisen vergleicht, um den niedrigsten anzuzeigenden Preis zu bestimmen.

Diese Verkettung zweier Indexer bedeutet in der Praxis, dass eine neu angelegte oder geänderte Catalog Price Rule erst nach einem vollständigen Durchlauf von catalogrule_rule und anschließend catalog_product_price tatsächlich im Frontend sichtbar wird. Läuft nur der eine Indexer, aber nicht der andere, zeigt der Katalog trotz korrekt berechneter Regelpreise weiterhin die alten Preise an, ein häufiger Verwirrungspunkt bei der Fehlersuche nach einer Regeländerung.

4. Performance-Probleme bei vielen aktiven Regeln und großem Katalog

Die Laufzeit des catalogrule_rule-Indexers wächst nicht linear, sondern kombinatorisch: Jede zusätzliche aktive Regel multipliziert sich mit der Anzahl betroffener Produkte, der Anzahl Kundengruppen, der Anzahl Websites und der Anzahl zeitlicher Gültigkeitsabschnitte. Bei einem Katalog mit mehreren Zehntausend Produkten und einer zweistelligen Zahl gleichzeitig aktiver, sich überschneidender Regeln kann ein voller Reindex-Lauf spürbar lange dauern und währenddessen erhebliche Datenbanklast erzeugen.

Besonders kritisch wirken sich Regeln mit unbegrenzten oder sehr weit in die Zukunft reichenden Gültigkeitszeiträumen aus, weil sie die Berechnung zeitlicher Abschnitte unnötig aufblähen, sowie breit gefasste Bedingungen, die praktisch den gesamten Katalog statt einer klar abgegrenzten Produktmenge treffen. Eine regelmäßige Durchsicht abgelaufener oder überflüssig gewordener Regeln, die aus Bequemlichkeit einfach deaktiviert statt gelöscht wurden, reduziert die Indexer-Last spürbar, weil deaktivierte Regeln zwar nicht neu berechnet, aber ihre historischen Zeilen in der Tabelle trotzdem mitgeführt werden.

5. Reindex-Modus strategisch wählen: Schedule versus Save

Im Modus Update on Save wird bei jeder Regeländerung sofort ein vollständiger Reindex angestoßen, was im Admin-Betrieb bei häufigen Regeländerungen zu spürbaren Wartezeiten führt, weil der Speichervorgang blockiert, bis der Indexer durchgelaufen ist. Für Shops mit häufig wechselnden Kampagnen ist Update by Schedule deutlich verträglicher, da die eigentliche Neuberechnung asynchron über den Cron-Job indexer_reindex_all_invalid beziehungsweise die Mview-Changelog-Verarbeitung läuft.

Wichtig ist dabei, den Cron-Takt realistisch auf die tatsächliche Änderungsfrequenz der Regeln abzustimmen: Ein zu selten laufender Reindex-Cron führt dazu, dass neue Rabattaktionen verspätet im Frontend erscheinen, während ein zu häufig laufender Cron unnötig Systemressourcen bindet, ohne dass sich zwischen zwei Läufen überhaupt etwas an den Regeln geändert hätte.


# Catalog-Rule-Indexer gezielt auf Schedule-Modus umstellen
bin/magento indexer:set-mode schedule catalogrule_rule catalog_product_price

6. Gezielte Reindex-Strategien statt pauschalem Voll-Reindex

Statt bei jeder kleinen Regeländerung reflexartig einen vollständigen Reindex über den gesamten Katalog anzustoßen, lohnt sich eine bewusste Trennung zwischen Regeln, die wirklich den gesamten Katalog betreffen, etwa eine websiteweite Rabattaktion, und Regeln, die nur eine klar abgegrenzte Produktmenge treffen, etwa eine einzelne Kategorie. Für letztere lässt sich über gezielte Bedingungen die Trefferzahl der Regel bewusst klein halten, was die kombinatorische Last des Indexers direkt reduziert.

Bei geplanten, im Voraus bekannten Kampagnen mit fixem Start- und Enddatum empfiehlt sich außerdem, die Regel rechtzeitig vor dem eigentlichen Kampagnenstart anzulegen und den Indexer außerhalb der Stoßzeiten einmalig vollständig durchlaufen zu lassen, statt auf den regulären Cron-Takt während des eigentlichen Kampagnenstarts zu vertrauen, wenn ohnehin erhöhte Systemlast durch mehr Traffic zu erwarten ist.

7. Grenzen des Partial Reindex bei Catalog Price Rules

Anders als etwa der Preisindexer für reguläre Produktpreisänderungen, der über Mview-Changelogs gezielt nur betroffene Produkte nachträgt, arbeitet der catalogrule_rule-Indexer bei einer Regeländerung faktisch immer regelbezogen vollständig: Ändert sich eine einzelne Regel, werden alle von dieser Regel betroffenen Produkte über den kompletten Gültigkeitszeitraum neu berechnet, nicht nur die seit dem letzten Lauf tatsächlich geänderten.

Diese Einschränkung lässt sich nicht durch Konfiguration umgehen, sondern nur durch eine bewusste Reduktion des Regel-Scopes selbst: Je kleiner die von einer einzelnen Regel betroffene Produktmenge, desto günstiger fällt jede Neuberechnung dieser Regel aus. Bei Regeln, die ohnehin nahezu den gesamten Katalog betreffen, bleibt oft nur die Möglichkeit, deren Änderungen bewusst zu bündeln und außerhalb der Hauptgeschäftszeiten einzuspielen, statt mehrere kleine Anpassungen über den Tag verteilt vorzunehmen.

8. Indexer-Laufzeit überwachen und Engpässe früh erkennen

Ein sinnvolles Monitoring erfasst die Laufzeit jedes catalogrule_rule-Durchlaufs über die Zeit und schlägt Alarm, sobald sich ein deutlicher Anstieg gegenüber dem historischen Durchschnitt zeigt, weil ein solcher Anstieg fast immer auf eine neu hinzugekommene, zu breit gefasste Regel oder eine unerwartet stark gewachsene Produktmenge hindeutet, lange bevor Kunden verspätete Preisaktualisierungen im Frontend bemerken.

Ergänzend hilft eine regelmäßige Kontrolle der Zeilenanzahl in catalogrule_product_price, da ein unerwartet sprunghafter Anstieg dieser Tabelle meist direkt mit einer neuen Regel korreliert, deren Bedingungen unbeabsichtigt viel breiter greifen als eigentlich beabsichtigt, etwa durch eine versehentlich zu allgemein formulierte Attributbedingung.

9. Indexer-Bausteine im Überblick

Die folgende Tabelle fasst die zentralen Bausteine des Catalog-Price-Rule-Indexings mit ihrer jeweiligen Rolle zusammen.

Baustein Zuständige Komponente Rolle Performance-Hinweis
Regelauswertung catalogrule_rule-Indexer Regelpreise pro Produkt/Gruppe/Datum berechnen Wächst kombinatorisch mit Regeln und Produkten
Ergebnisspeicher catalogrule_product_price Vorberechnete Preise mit Gültigkeitszeitraum Zeilenanzahl steigt mit zeitlich gestaffelten Regeländerungen
Finale Preisanzeige catalog_product_price-Indexer Regelpreise mit regulären Preisen vergleichen Braucht aktuellen catalogrule_rule-Lauf als Voraussetzung
Reindex-Modus Update on Save vs. Update by Schedule Steuerung des Zeitpunkts der Neuberechnung Schedule vermeidet blockierende Admin-Speichervorgänge
Regel-Scope Bedingungen und Gültigkeitszeitraum Trefferzahl und Zeitfenster begrenzen Enge Bedingungen reduzieren Indexer-Last direkt

Mironsoft

Magento-Entwicklung, Modul-Beratung und Systemarchitektur

Magento-Projekt, das eine zweite Meinung oder erfahrene Umsetzung braucht?

Wir entwickeln individuelle Magento-Module, beraten bei Architekturentscheidungen und übernehmen komplexe Umsetzungen, von der Service-Contract-Planung bis zum produktionsreifen Deployment.

Architektur-Beratung

Modul- und Systemarchitektur vor der Umsetzung fundiert durchdenken lassen.

Custom-Modul-Entwicklung

Individuelle Magento-Module nach Best Practices sauber umsetzen.

Code-Review & Audit

Bestehende Module auf Performance, Sicherheit und Wartbarkeit prüfen lassen.

10. Zusammenfassung

Catalog-Price-Rule-Indexer: Das Wichtigste auf einen Blick

Kernidee

Catalog Price Rules laufen über einen vorberechneten Index, nicht über Runtime-Auswertung wie Cart Price Rules.

Zentrale Tabelle

catalogrule_product_price hält vorberechnete Preise pro Produkt, Kundengruppe und Gültigkeitszeitraum.

Größtes Performance-Risiko

Kombinatorisches Wachstum bei vielen aktiven, breit gefassten Regeln auf großem Katalog.

Erfolgskriterium

Enge Regel-Bedingungen und Schedule-Modus statt pauschalem Voll-Reindex bei jeder Änderung.

11. FAQ: Catalog-Price-Rule-Indexer: Das Wichtigste auf einen Blick

1Warum laufen Catalog Price Rules über einen Index statt zur Laufzeit?
Weil eine Live-Auswertung sämtlicher Regeln gegen jedes Katalogprodukt bei jedem Seitenaufruf nicht performant genug wäre.
2Welcher Indexer berechnet die Catalog-Price-Rule-Preise?
Der Indexer mit der ID catalogrule_rule, der Ergebnisse in catalogrule_product_price schreibt.
3Warum reicht ein Lauf von catalogrule_rule allein nicht aus?
Weil die eigentliche Preisanzeige über den catalog_product_price-Indexer läuft, der die Regelpreise erst nachgelagert einbindet.
4Warum wächst die Laufzeit des Indexers nicht linear mit der Regelanzahl?
Weil sich Regeln, Produkte, Kundengruppen, Websites und Zeitfenster kombinatorisch multiplizieren.
5Welche Regeln belasten den Indexer besonders stark?
Regeln mit unbegrenzten Gültigkeitszeiträumen und sehr breit gefassten Bedingungen, die fast den gesamten Katalog treffen.
6Was ist der Unterschied zwischen Update on Save und Update by Schedule?
Update on Save blockiert den Speichervorgang bis zum vollständigen Reindex, Update by Schedule läuft asynchron über Cron.
7Wie lässt sich die Indexer-Last gezielt reduzieren?
Über eng gefasste Regelbedingungen, die nur eine klar abgegrenzte Produktmenge statt des gesamten Katalogs treffen.
8Wie erkennt man frühzeitig eine zu breit gefasste Regel?
Über einen ungewöhnlich starken Anstieg der Zeilenanzahl in catalogrule_product_price oder der Indexer-Laufzeit.
9Sollten abgelaufene Regeln einfach deaktiviert bleiben?
Nein, sie sollten regelmäßig aufgeräumt werden, da ihre historischen Zeilen sonst weiter mitgeführt werden.
10Wann sollte man einen manuellen Voll-Reindex vor einer Kampagne einplanen?
Bei geplanten Kampagnen mit fixem Startdatum, um den Indexer außerhalb der Stoßzeiten einmalig durchlaufen zu lassen.