Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
GILT FÜR: NoSQL
In diesem Artikel wird erläutert, wie Sie Daten (z. B. eine Sammlung, ein Diagramm oder eine Tabelle) in einem Container in Azure Cosmos DB abfragen. Insbesondere wird erläutert, wie Abfragen innerhalb einer Partition und partitionsübergreifende Abfragen in Azure Cosmos DB funktionieren.
Abfrage innerhalb einer Partition
Beim Abfragen von Daten aus Containern wird die Abfrage von Azure Cosmos DB automatisch verarbeitet, wenn für die Abfrage ein Partitionsschlüsselfilter angegeben ist. Die Abfrage wird an die physischen Partitionen weitergeleitet, die den im Filter angegebenen Partitionsschlüsselwerten entsprechen.
Betrachten Sie beispielsweise die folgende Abfrage mit einem Gleichheitsfilter für DeviceId. Wenn diese Abfrage für einen Container ausgeführt wird, der auf DeviceId partitioniert ist, filtert diese Abfrage eine einzelne physische Partition.
SELECT * FROM c WHERE c.DeviceId = 'XMS-0001'
Wie im vorherigen Beispiel filtert auch diese Abfrage eine einzelne Partition. Wenn Sie den Filter für Location hinzufügen, ändert sich die folgende Abfrage nicht:
SELECT * FROM c WHERE c.DeviceId = 'XMS-0001' AND c.Location = 'Seattle'
Im folgenden finden Sie eine Abfrage mit einem Bereichsfilter für den Partitionsschlüssel, der nicht auf eine einzelne physische Partition beschränkt ist. Eine Abfrage innerhalb einer Partition muss einen Gleichheitsfilter aufweisen, der den Partitionsschlüssel enthält:
SELECT * FROM c WHERE c.DeviceId > 'XMS-0001'
Partitionsübergreifende Abfrage
Die folgende Abfrage enthält keinen Filter für den Partitionsschlüssel (DeviceId). Daher muss sie auf alle physischen Partitionen ausgefächert und für die Indizes der einzelnen Partitionen ausgeführt werden:
SELECT * FROM c WHERE c.Location = 'Seattle`
Jede physische Partition hat einen eigenen Index. Wenn Sie daher eine partitionsübergreifende Abfrage für einen Container ausführen, führen Sie also tatsächlich eine Abfrage pro physischer Partition aus. Azure Cosmos DB aggregiert automatisch Ergebnisse über verschiedene physische Partitionen.
Die Indizes in verschiedenen physischen Partitionen sind voneinander unabhängig. Es gibt keinen globalen Standardindex in Azure Cosmos DB.
Optimieren von partitionsübergreifenden Abfragen mit globalen sekundären Indizes
Globale sekundäre Indizes (Vorschau) bieten einen alternativen Ansatz, um partitionsübergreifende Abfragen zu vermeiden, ohne den Partitionsschlüssel Ihres Containers zu ändern. Ein globaler sekundärer Index erstellt einen separaten, automatisch synchronisierten Container mit einem anderen Partitionsschlüssel, der für bestimmte Abfragemuster optimiert ist.
Wenn Ihr Container beispielsweise nach DeviceId partitioniert ist, Sie jedoch häufig nach Location abfragen, können Sie einen globalen sekundären Index erstellen, der nach Location partitioniert ist. Die Abfrage, die zuvor eine partitionsübergreifende Abfrage war, kann jetzt als Inpartitionsabfrage für den globalen sekundären Index ausgeführt werden:
SELECT * FROM c WHERE c.Location = 'Seattle'
Parallele partitionsübergreifende Abfrage
Azure Cosmos DB SDKs ab Version 1.9.0 unterstützen Optionen für die Ausführung paralleler Abfragen. Parallele partitionsübergreifende Abfragen ermöglichen partitionsübergreifende Abfragen mit geringer Wartezeit.
Sie können die parallele Ausführung von Abfragen verwalten, indem Sie die folgenden Parameter optimieren:
MaxConcurrency: Legt die maximale Anzahl gleichzeitiger Netzwerkverbindungen auf die Partitionen des Containers fest. Wenn Sie diese Eigenschaft auf -1 festlegen, verwaltet das SDK den Grad der Parallelität. Wenn derMaxConcurrencyWert auf 0 festgelegt ist, gibt es eine einzelne Netzwerkverbindung mit den Partitionen des Containers.MaxBufferedItemCount: steuert das Verhältnis zwischen Abfragewartezeit und clientseitiger Arbeitsspeichernutzung. Wenn diese Option nicht angegeben oder auf -1 festgelegt werden soll, verwaltet das SDK die Anzahl der elemente, die während der parallelen Abfrageausführung gepuffert wurden.
Aufgrund der Fähigkeit von Azure Cosmos DB, partitionsübergreifende Abfragen zu parallelisieren, wird die Abfragelatenz im Allgemeinen gut skaliert, da das System physische Partitionen hinzufügt. Die RU-Gebühren (Request Units, Anforderungseinheiten) steigen jedoch erheblich, wenn die Gesamtanzahl der physischen Partitionen zunimmt.
Bei einer partitionsübergreifenden Abfrage führen Sie im Wesentlichen eine separate Abfrage pro einzelner physischer Partition durch. Zwar verwenden partitionsübergreifende Abfragen den Index, sofern verfügbar, sie sind aber immer noch nicht so effizient wie Abfragen innerhalb von Partitionen.
Nützliches Beispiel
Mit dieser Analogie lassen sich partitionsübergreifende Abfragen besser erklären:
Stellen Sie sich vor, Sie sind ein Liefertreiber, der Pakete an verschiedene Apartmentkomplexe liefern muss. Zu jedem Gebäudekomplex gibt es eine Liste mit sämtlichen Wohneinheitsnummern. Wir können jeden Gebäudekomplex mit einer physischen Partition und jede Liste mit dem Index der physischen Partition vergleichen.
Abfragen innerhalb der Partition und partitionsübergreifende Abfragen lassen sich mit folgendem Beispiel vergleichen:
Abfragen innerhalb von Partitionen (Beispiel)
Wenn der Auslieferungsfahrer den richtigen Gebäudekomplex (physische Partition) kennt, kann er sofort zum richtigen Gebäude fahren. Der Fahrer kann anhand der Liste der Wohneinheitsnummern des Gebäudekomplexes (Index) schnell die entsprechenden Pakete zustellen. In diesem Fall verschwendet der Fahrer keine Zeit und Mühe damit, zu einem Gebäudekomplex zu fahren und zu überprüfen, ob ein Paketempfänger dort wohnt.
Partitionsübergreifende Abfrage (Ausfächern)
Wenn der Auslieferungsfahrer den richtigen Gebäudekomplex (physische Partition) nicht kennt, muss er zu jedem einzelnen Gebäude fahren und die Liste mit allen Wohneinheitsnummern (den Index) überprüfen. Sobald der Fahrer an einem Gebäudekomplex ankommt, kann er immer noch die Liste der Adressen der einzelnen Bewohner verwenden. Allerdings muss er die Liste jedes Gebäudekomplexes überprüfen, unabhängig davon, ob dort Paketempfänger wohnen oder nicht. Dieses Beispiel zeigt, wie partitionsübergreifende Abfragen funktionieren. Es kann zwar der Index genutzt werden (d. h., es muss nicht an jede Tür geklopft werden), aber der Index jeder physischen Partition muss separat überprüft werden.
Partitionsübergreifende Abfrage (beschränkt auf einige physische Partitionen)
Wenn der Auslieferungsfahrer weiß, dass alle Paketempfänger in einigen wenigen Gebäudekomplexen leben, muss er nicht zu jedem einzelnen fahren. Während die Fahrt zu einigen wenigen Gebäudekomplexen immer noch mehr Aufwand erfordert, als nur ein einzelnes Gebäude aufzusuchen, spart der Auslieferungsfahrer trotzdem viel Zeit und Aufwand. Wenn der Filter einer Abfrage den Partitionsschlüssel mit dem IN-Schlüsselwort enthält, werden nur die Indizes der relevanten physischen Partition auf Daten überprüft.
Partitionsübergreifende Abfragen vermeiden
Für die meisten Container ist es unvermeidlich, einige partitionsübergreifende Abfragen zu haben, und das ist in Ordnung! Fast alle Abfragevorgänge werden partitionsübergreifend unterstützt, sowohl für logische Partitionsschlüssel als auch für physische Partitionen. Azure Cosmos DB bietet auch viele Optimierungen in Abfrage-Engine und Client-SDKs, um die Abfrageausführung physische Partitionen übergreifend zu parallelisieren.
Bei den meisten Szenarien mit vielen Lesevorgängen sollten Sie die gängigste Eigenschaft in den Abfragefiltern auswählen. Außerdem sollten Sie sicherstellen, dass Ihr Partitionsschlüssel anderen bewährten Methoden für die Auswahl von Partitionsschlüsseln entspricht.
Die Vermeidung partitionsübergreifender Abfragen ist in der Regel nur bei großen Containern von Bedeutung. Sie werden jedes Mal, wenn Sie den Index einer physischen Partition auf Ergebnisse überprüfen, mit mindestens 2,5 RUs belastet, selbst wenn keine Elemente in der physischen Partition dem Filter der Abfrage entsprechen. Wenn Sie nur über eine (oder nur wenige) physische Partitionen verfügen, verbrauchen partitionsübergreifende Abfragen nicht wesentlich mehr RUs als In-Partitionsabfragen.
Die Anzahl der physischen Partitionen ist an die Anzahl der bereitgestellten RUs gebunden. Jede physische Partition ermöglicht bis zu 10.000 bereitgestellte RUs und kann bis zu 50 GB Daten speichern. Azure Cosmos DB verwaltet physische Partitionen automatisch für Sie. Die Anzahl der physischen Partitionen in Ihrem Container hängt von dem bereitgestellten Durchsatz und dem verbrauchten Speicher ab.
Sie sollten versuchen, partitionsübergreifende Abfragen zu vermeiden, wenn die Workload die folgenden Kriterien erfüllt:
- Sie planen, über 30.000 RUs bereitgestellt zu haben
- Sie planen, mehr als 100 GB Daten zu speichern.
Erwägen Sie die Verwendung globaler sekundärer Indizes (Vorschau), um partitionsübergreifende Abfragen zu vermeiden. Mit globalen sekundären Indizes können Sie zusätzliche Container mit unterschiedlichen Partitionsschlüsseln erstellen, die automatisch mit Ihrem Quellcontainer synchronisiert werden. Bei diesem Ansatz können partitionsübergreifende Abfragen für bestimmte Abfragemuster entfernt werden, ohne dass Änderungen an Der vorhandenen Anwendungslogik oder dem Partitionsschlüssel erforderlich sind.