Was ist der Unterschied zwischen Scan und Abfrage in Dynamodb? Wann Scan / Abfrage verwenden?

84

Eine Abfrageoperation wie in der DynamoDb-Dokumentation angegeben:

Eine Abfrageoperation durchsucht nur Primärschlüsselattributwerte und unterstützt eine Teilmenge von Vergleichsoperatoren für Schlüsselattributwerte, um den Suchprozess zu verfeinern.

und der Scanvorgang:

Ein Scanvorgang scannt die gesamte Tabelle. Sie können Filter angeben, die auf die Ergebnisse angewendet werden sollen, um die an Sie zurückgegebenen Werte nach dem vollständigen Scan zu verfeinern.

Welches ist am besten basierend auf Leistung und Kostenüberlegungen.

Samson
quelle

Antworten:

52

Wählen Sie beim Erstellen einer Dynamodb-Tabelle Primärschlüssel und lokale Sekundärindizes (LSIs) aus, damit eine Abfrageoperation die gewünschten Elemente zurückgibt.

Abfrageoperationen unterstützen nur eine gleichwertige Operatorauswertung des Primärschlüssels, sind jedoch vom Sortierschlüssel abhängig (=, <, <=,>,> =, zwischen, beginnen).

Scanvorgänge sind im Allgemeinen langsamer und teurer, da der Vorgang jedes Element in Ihrer Tabelle durchlaufen muss, um die von Ihnen angeforderten Elemente zu erhalten.

Beispiel:

Table: CustomerId, AccountType, Country, LastPurchase

Primary Key: CustomerId + AccountType

In diesem Beispiel können Sie eine Abfrageoperation verwenden, um Folgendes abzurufen:

  1. Eine Kunden-ID mit einem bedingten Filter für AccountType

Ein Scanvorgang müsste verwendet werden, um Folgendes zurückzugeben:

  1. Alle Kunden mit einem bestimmten AccountType
  2. Artikel basierend auf bedingten Filtern nach Land, dh Alle Kunden aus den USA
  3. Artikel, die auf bedingten Filtern von LastPurchase basieren, dh allen Kunden, die im letzten Monat einen Kauf getätigt haben

Um Scanvorgänge bei häufig verwendeten Vorgängen zu vermeiden, erstellen Sie einen lokalen Sekundärindex (LSI) oder einen globalen Sekundärindex (GSI).

Beispiel:

Table: CustomerId, AccountType, Country, LastPurchase

Primary Key: CustomerId + AccountType
GSI: AccountType + CustomerId
LSI: CustomerId + LastPurchase

In diesem Beispiel können Sie mit einer Abfrageoperation Folgendes erhalten:

  1. Eine Kunden-ID mit einem bedingten Filter für AccountType
  2. [GSI] Ein bedingter Filter für Kunden-IDs für einen bestimmten Kontotyp
  3. [LSI] Eine Kunden-ID mit einem bedingten Filter für LastPurchase
Kinman
quelle
1
Wenn Primärschlüssel: CustomerId + AccountType (Ich verstehe, dass CustomerID der Partitionsschlüssel und AccountType der Sortierschlüssel ist) Ich denke, Sie können einen Abfragevorgang nur über CustomerID oder CustomerID + AccountType ausführen. Wenn Sie nur nach AccountType suchen, wäre dies ein Scan
Adil
1
Danke @Adil. Sie haben Recht, ich habe meine Antwort bearbeitet, um dies widerzuspiegeln.
Kinman
34

Sie haben Dynamodb-Tabellenpartitionsschlüssel / Primärschlüssel als customer_country. Wenn Sie eine Abfrage verwenden, customer_countryist dies das Pflichtfeld für die Abfrageoperation. Alle Filter können nur zu Elementen gemacht werden, die dazu gehören customer_country.

Wenn Sie einen Tabellenscan durchführen, wird der Filter für alle Partitionsschlüssel / Primärschlüssel ausgeführt. Zuerst wurden alle Daten abgerufen und nach dem Abrufen aus der Tabelle ein Filter angewendet.

z.B:

Hier customer_countryist der Partitionsschlüssel / Primärschlüssel und idder sort_key

-----------------------------------

customer_country | name   | id

-----------------------------------
VV               | Tom    | 1

VV               | Jack   | 2

VV               | Mary   | 4

BB               | Nancy  | 5

BB               | Lom    | 6

BB               | XX     | 7

CC               | YY     | 8

CC               | ZZ     | 9

------------------------------------
  • Wenn Sie eine Abfrageoperation ausführen, gilt diese nur für den customer_countryWert. Der Wert sollte nur der gleiche Operator (=) sein.

  • Es werden also nur Elemente abgerufen, die diesem Partitionsschlüssel / Primärschlüsselwert entsprechen.

  • Wenn Sie einen Scanvorgang ausführen, werden alle Elemente in dieser Tabelle abgerufen und Daten herausgefiltert, nachdem diese Daten erfasst wurden.

Hinweis: Führen Sie keinen Scanvorgang durch, der Ihre RCU überschreitet.

OK200
quelle
Können Sie die Quelle Ihrer Antwort angeben?
AlikElzin-Kilaka
10

Abfrage ist viel besser als Scan - Leistung. Beim Scannen wird, wie der Name schon sagt, die gesamte Tabelle gescannt. Sie müssen jedoch den Tabellenschlüssel, den Sortierschlüssel, die Indizes und die zugehörigen Sortierindizes kennen, um zu wissen, dass Sie die Abfrage verwenden können. Wenn Sie Ihre Abfrage filtern mit:

  • Schlüssel
  • Schlüssel & Schlüsselsortierung
  • Index
  • Index und zugehöriger Sortierschlüssel

benutze Query! Verwenden Sie andernfalls einen Scan, der flexibler ist, welche Spalten Sie filtern können.

Sie können NICHT abfragen, wenn:

  • mehr als 2 Felder im Filter (zB Schlüssel, Sortierung und Index)
  • Nur Sortierschlüssel (Primärschlüssel oder Index)
  • reguläre Felder (nicht Schlüssel, Index oder Sortierung)
  • gemischter Index und Sortierung (Index1 mit Sortierung von Index2) \
  • ...

eine gute Erklärung: https://medium.com/@amos.shahar/dynamodb-query-vs-scan-sql-syntax-and-join-tables-part-1-371288a7cb8f

Öffnen Sie Voip
quelle
9

In Bezug auf die Leistung halte ich es für eine gute Praxis, Ihre Tabelle für Anwendungen zu entwerfen, die Queryanstelle von verwendet werden sollen Scan. Da bei einem Scanvorgang immer die gesamte Tabelle gescannt wird, bevor die gewünschten Werte herausgefiltert werden, dauert die Verarbeitung von Datenvorgängen wie Lesen, Schreiben und Löschen mehr Zeit und Platz. Weitere Informationen finden Sie im offiziellen Dokument

Liutong Chen
quelle
7

Es ist ähnlich wie in der relationalen Datenbank.

Holen querySie sich, Sie verwenden einen Primärschlüssel in whereBedingung. Die Komplexität der Berechnung ist, log(n)da der größte Teil der Schlüsselstruktur ein Binärbaum ist.

Während der scanAbfrage müssen Sie die gesamte Tabelle scannen und dann auf jede einzelne einen Filter anwenden row, um das richtige Ergebnis zu finden. Die Leistung ist O(n). Es ist viel langsamer, wenn Ihr Tisch groß ist.

Kurz gesagt, versuchen Sie zu verwenden, getwenn Sie den Primärschlüssel kennen. nur scanfür den schlimmsten Fall.

Denken Sie auch an den globalen Sekundärindex, um eine andere Art von Abfragen für verschiedene Schlüssel zu unterstützen und das Leistungsziel zu erreichen

Joey Trang
quelle