Azure Cosmos DB, Best practices, Databases
Drei Möglichkeiten zur Nutzung zusammengesetzter Indizes in Azure Cosmos DB
Posted on
3 min read
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:
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:
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.