2016-12-27 3 views
0

Ich frage mich, über die partitionkey in einer partitionierten DocumentDB Sammlung in das folgende Szenario:Partitioning in DocumentDB

  1. Jedes Dokument C in der Sammlung enthält zwei Felder: a und b
  2. Es ist notwendig, schnelle Lookups für Dokument C mit beiden Feldern a und b als Kriterien für die Nachschlagewerke (mit ihnen in der sql Abfrage where Klausel).

Ich glaube, ist notwendig, irgendwie beiden Felder angeben, das Ziel zu erreichen 2. Gibt es eine Möglichkeit, beiden Felder für meine Sammlung a und b als Partitionsschlüssel angeben?

Wenn nicht, gibt es eine alternative Lösung?

Antwort

1

Ich denke, Sie können zwei Begriffe hier vermischt haben - Partitionierung und Indexierung.

Um schnelle Abrufvorgänge mit den Kriterien a und b zu unterstützen, müssen die Dokumente für diese Felder indexiert sein. Glücklicherweise indiziert DocumentDB bereits für Sie, so dass Sie eine schnelle Leistung erhalten. Siehe https://docs.microsoft.com/en-us/azure/documentdb/documentdb-indexing

Partitionierung ist eine Möglichkeit, Ihre Daten, wenn Sie eine Menge davon haben, über mehrere Sammlungen aufzuteilen, um mit Daten umzugehen, die über das einzige Sammlungslimit hinausgehen. Wenn Sie einen Partitionsschlüssel angeben, werden Dokumente mit demselben Schlüssel zur selben Sammlung weitergeleitet. Siehe https://docs.microsoft.com/en-us/azure/documentdb/documentdb-partition-data

Welche Logik sollten Sie bei der Auswahl eines Partitionsschlüssels berücksichtigen? Als Faustregel gilt, dass Dokumente, die in Ihren Abfragen zusammenkommen, in derselben Sammlung gefunden werden. Wenn Sie beispielsweise viele Abfragen ausführen, die alle Dokumente für eine bestimmte userId zurückgeben, möchten Sie möglicherweise nach Benutzer-ID partitionieren.

+0

danke für die Klarstellung. In meinem Fall ist das Dokument C eine Transaktion und das Feld a ist die Sender-ID einer Transaktion und das Feld b ist die Empfänger-ID dieser Transaktion.Ich möchte nach allen Transaktionen suchen, die an b gesendet wurden. Ich verwende als Partitionsschlüssel die Transaktions-ID selbst. –

+0

Sind Sie sicher, dass Sie partitionieren müssen? Mit welchen Daten haben Sie zu tun? Die Antwort ist immer noch die gleiche - docdb wird eine effiziente Suche über alle Partitionen mit Ihrer Abfrage durchführen und dann die Ergebnisse kombinieren. – PartlyCloudy

+0

ist wie 300 G Transaktionsdaten. Ich habe einen Test durchgeführt und 5k Transaktionen von A nach B in fast 1 Minute abgerufen, um diese Transaktionssätze abzurufen. –

1

Es gibt zwei Möglichkeiten, dies zu tun:

  • Wählen Sie entweder a oder b (Empfänger) als Partitionsschlüssel. Da DocumentDB alle Eigenschaften automatisch indiziert, werden Abfragen für eine einzelne Partition ausgeführt.
  • Erstellen Sie eine neue Eigenschaft, dass die verketteten Wert von a und b (zB from:[email protected];to:[email protected] und verwenden ist, dass als Partitions-Taste. Dann, wenn Abfragen durchführen, um die neue Eigenschaft als Filter in Ihren Abfragen enthalten.

Die zweite Ansatz ist effizienter als der erste für Abfrage von beiden a und b. Wenn Sie eine Mischung von Abfragen mit nur a oder beide (a und b) haben, dann ist der erste Ansatz besser, da beide Abfragen gegen eine einzelne Partition sein werden.

Aber wie bereits erwähnt, haben Sie eine Antwortreaktion mit niedriger Latenz bei beiden Ansätzen oder wenn Sie einen anderen Partitionsschlüssel wie die Transaktions-ID ausgewählt haben. Die oben genannten Vorgehensweisen sind jedoch am besten für eine Abfrageauslastung geeignet, die nach a und b filtert.