Drei Möglichkeiten zur Nutzung zusammengesetzter Indizes in Azure Cosmos DB

Veröffentlicht am 19 September, 2019

Program Manager, Azure Cosmos DB

Zusammengesetzte Indizes in Azure Cosmos DB wurden auf der Microsoft Build 2019 vorgestellt. Mit unserem neuesten Dienstupdate können zusammengesetzte Indizes nun in weiteren Abfragetypen genutzt werden. In diesem Beitrag beschäftigen wir uns näher mit zusammengesetzten Indizes und stellen gängige Anwendungsfälle vor.

Indextypen in Azure Cosmos DB

Aktuell gibt es in Azure Cosmos DB die folgenden Indextypen, die für die folgenden Typen von Abfragen verwendet werden:

Bereichsindizes:

  • Gleichheitsabfragen
  • Bereichsabfragen
  • ORDER BY-Abfragen für eine einzige Eigenschaft
  • JOIN-Abfragen

Räumliche Indizes:

  • Geofunktionen

Zusammengesetzte Indizes:

  • ORDER BY-Abfragen für mehrere Eigenschaften
  • Abfragen mit einem Filter und einer ORDER BY-Klausel
  • Abfragen mit einem Filter für zwei oder mehr Eigenschaften

Anwendungsfälle für zusammengesetzte Indizes

Standardmäßig wird in Azure Cosmos DB für jede Eigenschaft ein Bereichsindex erstellt. Diese Indizes sind für viele Workloads ausreichend, sodass keine weitere Optimierung erforderlich ist. Zusätzlich zu den standardmäßigen Bereichsindizes können zusammengesetzte Indizes hinzugefügt werden. In zusammengesetzten Indizes wird für jede darin enthaltene Eigenschaft sowohl ein Pfad als auch eine Reihenfolge (aufsteigend oder absteigend) definiert.

ORDER BY-Abfragen für mehrere Eigenschaften

Wenn eine Abfrage eine ORDER BY-Klausel mit zwei oder mehr Eigenschaften aufweist, ist ein zusammengesetzter Index erforderlich. Beispielsweise erfordert die folgende Abfrage einen zusammengesetzten Index mit Definition von Alter („age“) und Name („age ASC“ (aufsteigend), „name ASC“ (aufsteigend)):

SELECT * FROM c ORDER BY c.age ASC, c.name ASC

Bei dieser Abfrage werden alle Ergebnisse in aufsteigender Reihenfolge nach dem Wert der Eigenschaft „age“ sortiert. Wenn zwei Dokumente denselben Wert für „age“ enthalten, werden die Dokumente in der Abfrage nach Namen sortiert.

Abfragen mit einem Filter und einer ORDER BY-Klausel

Wenn eine Abfrage einen Filter sowie eine ORDER BY-Klausel für mehrere Eigenschaften enthält, lässt sich mit einem zusammengesetzten Index die Leistung verbessern. Bei der folgenden Abfrage sind beispielsweise weniger Anforderungseinheiten (Request Units, RUs) erforderlich, wenn ein zusammengesetzter Index für „name“ und „age“ definiert und die Abfrage aktualisiert wird, um „name“ in die ORDER BY-Klausel einzuschließen:

Ursprüngliche Abfrage mit Bereichsindex:

SELECT * FROM c WHERE c.name = “Tim” ORDER BY c.age ASC

Geänderte Abfrage mit zusammengesetztem Index für „name“ und „age“:

SELECT * FROM c WHERE c.name = “Tim” ORDER BY c.name ASC, c.age ASC

Mit einem zusammengesetzten Index lässt sich die Abfrageleistung erheblich steigern, Sie können aber auch weiterhin die ursprüngliche Abfrage ohne zusammengesetzten Index erfolgreich ausführen. Wenn Sie die geänderte Abfrage mit zusammengesetztem Index ausführen, werden die Dokumente nach der Eigenschaft „age“ sortiert. Da alle Dokumente, die dem Filter entsprechen, denselben Wert für „name“ aufweisen, werden sie von der Abfrage in aufsteigender Reihenfolge nach „age“ sortiert zurückgegeben.

Abfragen mit einem Filter für mehrere Eigenschaften

Wenn eine Abfrage einen Filter für zwei oder mehr Eigenschaften enthält, lässt sich mit einem zusammengesetzten Index die Leistung verbessern.

Betrachten Sie die folgende Abfrage:

SELECT * FROM c WHERE c.name = “Tim” and c.age > 18

Ohne zusammengesetzten Index („name ASC“ und „age ASC“) wird für diese Abfrage ein Bereichsindex verwendet. Wir können die Abfrage effizienter machen, indem wir einen zusammengesetzten Index für „name“ und „age“ erstellen.

Der zusammengesetzte Index wird in Abfragen mit mehreren Gleichheitsfiltern und maximal einem Bereichsfilter (wie >, <, <=, >=, !=) verwendet. In bestimmten Fällen, wenn in einer Abfrage ein zusammengesetzter Index nicht vollständig verwendet werden kann, wird eine Kombination aus den definierten zusammengesetzten Indizes und Bereichsindizes verwendet. Weitere Informationen finden Sie in unserer Dokumentation zu Indizierungsrichtlinien.

Leistungsvorteile zusammengesetzter Indizes

Anhand einiger Beispielabfragen können wir die Leistungsvorteile zusammengesetzter Indizes demonstrieren. Dazu verwenden wir ein Dataset zu Nährwerten, das in Azure Cosmos DB Labs verwendet wird.

In diesem Beispiel optimieren wir eine Abfrage mit einem Filter und einer ORDER BY-Klausel. Wir beginnen mit der Standardindizierungsrichtlinie, nach der alle Eigenschaften mit einem Bereichsindex indiziert werden. Wenn wir die in der folgenden Abbildung dargestellte Abfrage im Azure-Portal ausführen, sind diese Abfragemetriken zu beobachten:

Abfragemetriken:

Abfrage mit Bereichsindex, die 21,8 RUs verbraucht.

Diese Abfrage mit der Standardindizierungsrichtlinie hat 21,8 RUs verbraucht.

Wenn wir einen zusammengesetzten Index für „foodGroup“ und „_ts“ hinzufügen und den Abfragetext aktualisieren, um „foodGroup“ in die ORDER BY-Klausel einzuschließen, sinkt der RU-Verbrauch der Abfrage erheblich.

Abfragemetriken:

Abfrage mit zusammengesetztem Index, die 4,07 RUs verbraucht.

Nach dem Hinzufügen eines zusammengesetzten Index ist der RU-Verbrauch der Abfrage von 21,8 RUs auf nur 4,07 RUs gesunken. Eine solche Abfrageoptimierung wird mit zunehmender Gesamtdatengröße immer wirkungsvoller. Ein zusammengesetzter Index ist sehr vorteilhaft, wenn die Eigenschaften in der ORDER BY-Klausel eine hohe Kardinalität besitzen.

Erstellen zusammengesetzter Indizes

Weitere Informationen zum Erstellen zusammengesetzter Indizes finden Sie in dieser Dokumentation. Die Indizierungsrichtlinie kann einfach direkt im Azure-Portal aktualisiert werden. Während der Erstellung eines zusammengesetzten Index für Daten, die sich bereits in Azure Cosmos DB befinden, werden zur Indexaktualisierung die RUs verwendet, die vom Normalbetrieb übrig sind. Wenn die neue Indizierungsrichtlinie definiert ist, werden in Azure Cosmos DB Eigenschaften automatisch mit einem zusammengesetzten Index indiziert, sobald sie geschrieben werden.

Finden Sie heraus, ob zusammengesetzte Indizes zu einer besseren RU-Nutzung für Ihre vorhandenen Workloads in Azure Cosmos DB führen.