Arbeiten mit Scans in DynamoDB - Amazon DynamoDB

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Arbeiten mit Scans in DynamoDB

Eine Scan-Operation in Amazon DynamoDB liest jedes Element in einer Tabelle oder einem Sekundärindex. Standardmäßig gibt ein Scan-Vorgang für jedes Element in der Tabelle oder im Index alle Datenattribute zurück. Sie können den ProjectionExpression-Parameter verwenden, sodass Scan nur einige der Attribute und nicht alle zurückgibt.

Scan gibt immer einen Ergebnissatz zurück. Wenn keine übereinstimmenden Elemente gefunden werden, ist die Ergebnismenge leer.

Eine einzelne Scan-Anforderung kann maximal 1 MB Daten abrufen. DynamoDB kann optional einen Filterausdruck auf diese Daten anwenden, um die Ergebnisse einzugrenzen, bevor sie an den Benutzer zurückgegeben werden.

Filterausdrücke für Scan

Wenn Sie die Scan-Ergebnisse weiter eingrenzen müssen, können Sie optional einen Filterausdruck angeben. Ein Filterausdruck bestimmt, welche Elemente in den Scan-Ergebnissen an Sie zurückgegeben werden. Alle anderen Ergebnisse werden verworfen.

Ein Filterausdruck wird angewendet, nachdem eine Scan abgeschlossen ist, aber bevor die Ergebnisse zurückgegeben werden. Folglich verbraucht eine Scan unabhängig davon, ob ein Filterausdruck vorhanden ist oder nicht, gleich viel Lesekapazität.

Eine Scan-Operation kann bis zu 1 MB an Daten abrufen. Diese Größenbeschränkung gilt, bevor der Filterausdruck ausgewertet wird.

Mit Scan können Sie Attribute in einem Filterausdruck angeben—einschließlich Partitionsschlüsseln und Sortierschlüsselattributen.

Die Syntax für einen Filterausdruck ist identisch mit der für einen Bedingungsausdruck. Filterausdrücke können dieselben Vergleichsoperatoren, Funktionen und logischen Operatoren wie ein Bedingungsausdruck verwenden. Weitere Informationen zu logischen Operatoren finden Sie unter Vergleichsoperator und Funktionsreferenz.

Beispiel

Das folgende AWS Command Line Interface (AWS CLI)-Beispiel scannt die Thread Tabelle und gibt nur die Elemente zurück, die zuletzt von einem bestimmten Benutzer in gepostet wurden.

aws dynamodb scan \ --table-name Thread \ --filter-expression "LastPostedBy = :name" \ --expression-attribute-values '{":name":{"S":"User A"}}'

Begrenzung der Anzahl an Elementen in der Ergebnismenge

Die Scan-Operation ermöglicht es Ihnen, die Anzahl der Elemente einzuschränken, die in den Ergebnissen zurückgegeben werden. Legen Sie dafür vor dem Filtern der Ausdrucksauswertung den Parameter Limit auf die maximale Anzahl von Elementen fest, die die Scan-Operation zurückgeben soll.

Beispiel: Sie führen eine Scan-Operation für eine Tabelle mit einem Limit-Wert von 6 und ohne Filterausdruck durch. DieScan-Ergebnis enthält die ersten sechs Elemente der Tabelle.

Angenommen, Sie fügen nun einen Filterausdruck der Scan hinzu. In diesem Fall wendet DynamoDB den entsprechenden Filterausdruck auf die sechs zurückgegebenen Elemente an, wobei die nicht übereinstimmenden verworfen werden. Das letzte Scan-Ergebnis enthält sechs Elemente oder weniger, je nachdem, wie viele Elemente gefiltert wurden.

Paginierung der Ergebnisse

DynamoDB paginiert die Ergebnisse von Scan-Operationen. Bei der Paginierung werden die Scan-Ergebnisse in „Seiten“ mit Daten von einer Größe von 1 MB (oder weniger) unterteilt. Eine Anwendung kann die erste Ergebnisseite verarbeiten, dann die zweite Seite und so weiter.

Eine einzelne Scan-Operation gibt nur einen Ergebnissatz zurück, der innerhalb des Grenzwerts von 1 MB liegt.

Um zu bestimmen, ob es mehr Ergebnisse gibt, und diese seitenweise abzurufen, sollten Anwendungen die folgenden Schritte ausführen:

  1. Überprüfen Sie das Scan-Low-Level-Ergebnis:

    • Wenn das Ergebnis ein LastEvaluatedKey-Element enthält, fahren Sie mit Schritt 2 fort.

    • Wenn im Ergebnis kein LastEvaluatedKey vorhanden ist, sind keine Elemente mehr zum Abrufen vorhanden.

  2. Erstellen Sie eine neue Scan-Anforderung mit den gleichen Parametern wie bei der vorherigen Anforderung. Verwenden Sie jedoch dieses Mal den LastEvaluatedKey-Wert aus Schritt 1 als ExclusiveStartKey-Parameter in der neuen Scan-Anforderung.

  3. Führen Sie die neue Scan-Anforderung aus.

  4. Fahren Sie mit Schritt 1 fort.

Mit anderen Worten: Der LastEvaluatedKey einer Scan-Antwort sollte als ExclusiveStartKey für die nächste Scan-Anforderung verwendet werden. Wenn in einer Scan-Antwort kein LastEvaluatedKey-Element vorhanden ist, haben Sie die letzte Ergebnisseite abgerufen. (Dass LastEvaluatedKey nicht vorhanden ist, ist der einzige Hinweis darauf, dass Sie das Ende des Ergebnissatzes erreicht haben.)

Sie können die verwenden AWS CLI , um dieses Verhalten anzuzeigen. sendet wiederholt AWS CLI Low-Level-ScanAnforderungen an DynamoDB, bis in den Ergebnissen nicht mehr vorhanden LastEvaluatedKey ist. Betrachten Sie das folgende AWS CLI Beispiel, das die gesamte Movies Tabelle scannt, aber nur die Filme aus einem bestimmten Genre zurückgibt.

aws dynamodb scan \ --table-name Movies \ --projection-expression "title" \ --filter-expression 'contains(info.genres,:gen)' \ --expression-attribute-values '{":gen":{"S":"Sci-Fi"}}' \ --page-size 100 \ --debug

Normalerweise AWS CLI verarbeitet die die Paginierung automatisch. In diesem Beispiel begrenzt der AWS CLI --page-size Parameter jedoch die Anzahl der Elemente pro Seite. Der --debug-Parameter gibt Low-Level-Informationen zu Anforderungen und Antworten aus.

Anmerkung

Ihre Paginierungsergebnisse unterscheiden sich auch basierend auf den Eingabeparametern, die Sie übergeben.

  • Die Verwendung von aws dynamodb scan --table-name Prices --max-items 1 gibt NextToken zurück.

  • Die Verwendung von aws dynamodb scan --table-name Prices --limit 1 gibt LastEvaluatedKey zurück.

Beachten Sie auch, dass insbesondere die Verwendung von --starting-token den Wert NextToken erfordert.

Wenn Sie das Beispiel ausführen, sieht die erste Antwort von DynamoDB ungefähr folgendermaßen aus.

2017-07-07 12:19:14,389 - MainThread - botocore.parsers - DEBUG - Response body: b'{"Count":7,"Items":[{"title":{"S":"Monster on the Campus"}},{"title":{"S":"+1"}}, {"title":{"S":"100 Degrees Below Zero"}},{"title":{"S":"About Time"}},{"title":{"S":"After Earth"}}, {"title":{"S":"Age of Dinosaurs"}},{"title":{"S":"Cloudy with a Chance of Meatballs 2"}}], "LastEvaluatedKey":{"year":{"N":"2013"},"title":{"S":"Curse of Chucky"}},"ScannedCount":100}'

Der LastEvaluatedKey in der Antwort gibt an, dass nicht alle Elemente abgerufen wurden. Der gibt AWS CLI dann eine weitere Scan Anforderung an DynamoDB aus. Dieses Anforderungs- und Antwortmuster wird bis zur endgültigen Antwort fortgesetzt.

2017-07-07 12:19:17,830 - MainThread - botocore.parsers - DEBUG - Response body: b'{"Count":1,"Items":[{"title":{"S":"WarGames"}}],"ScannedCount":6}'

Das Fehlen von LastEvaluatedKey gibt an, dass keine abrufbaren Elemente mehr vorhanden sind.

Anmerkung

Die AWS SDKs verarbeiten die DynamoDB-Low-Level-Antworten (einschließlich des Vorhandenseins oder Fehlens von LastEvaluatedKey) und bieten verschiedene Abstraktionen für die Paginierung von Scan Ergebnissen. Beispielsweise stellt SDK für die Java-Dokumentschnittstelle java.util.Iterator-Unterstützung bereit, sodass Sie die Ergebnisse nacheinander durchgehen können.

Codebeispiele in verschiedenen Programmiersprachen finden Sie im Amazon-DynamoDB-Handbuch für erste Schritte und in der AWS SDK-Dokumentation für Ihre Sprache.

Zählen der Elemente in den Ergebnissen

Zusätzlich zu den Elementen, die mit Ihren Kriterien übereinstimmen, enthält die Scan-Antwort noch die folgenden Elemente:

  • ScannedCount – Anzahl der ausgewerteten Elemente vor jedem ScanFilter angewendet wird. Ein hoher ScannedCount-Wert mit wenigen oder gar keinen Count-Ergebnissen weist auf eine ineffiziente Scan-Operation hin. Wenn Sie keinen Filter in der Anforderung verwendet haben, haben ScannedCount und Count denselben Wert.

  • Count – die Anzahl der Elemente, die verbleiben, nachdem ein Filterausdruck (falls vorhanden) angewendet wurde.

Anmerkung

Wenn Sie keinen Filterausdruck verwenden, haben ScannedCount und Count denselben Wert.

Wenn der Scan-Ergebnissatz größer als 1 MB ist, repräsentieren ScannedCount und Count nur eine Teilmenge der Gesamtelemente. Sie müssen mehrere Scan-Operationen ausführen, um alle Ergebnisse abzurufen (siehe Paginierung der Ergebnisse).

Jede Scan-Antwort enthält die ScannedCount und Count für die Elemente, die von der betreffenden Scan-Anforderung verarbeitet wurden. Um eine Gesamtsumme für alle Scan-Anforderungen zu erhalten, könnten Sie eine laufende Zählung von ScannedCount und Count vornehmen.

Durch die Abfrage verbrauchte Kapazitätseinheiten

Sie können Scan für jede Tabelle und jeden Sekundärindex ausführen. Scan-Operationen verbrauchen Lesekapazitätseinheiten wie folgt.

Wenn Sie Scan eine ... DynamoDB verbraucht Lesekapazitätseinheiten von ...
Tabelle Die bereitgestellte Lesekapazität der Tabelle.
Globaler sekundärer Index Die bereitgestellte Lesekapazität des Index.
Lokaler sekundärer Index Die bereitgestellte Lesekapazität der Basistabelle.

Standardmäßig gibt eine Scan-Operation keine Daten über seinen Lesekapazitätsverbrauch zurück. Jedoch können Sie den ReturnConsumedCapacity-Parameter in einer Scan-Anforderung angeben, um diese Information zu erhalten. Folgende sind die gültigen Einstellungen für ReturnConsumedCapacity:

  • NONE – Es werden keine verbrauchten Kapazitätsdaten zurückgegeben. (Dies ist die Standardeinstellung.)

  • TOTAL – Die Antwort enthält die zusammengefasste Anzahl der verbrauchten Lesekapazitätseinheiten.

  • INDEXES – Die Antwort zeigt die zusammengefasste Anzahl der verbrauchten Lesekapazitätseinheiten, zusammen mit der verbrauchten Kapazität für jede aufgerufene Tabelle und jeden aufgerufenen Index, an.

DynamoDB berechnet die Anzahl der verbrauchten Lesekapazitätseinheiten basierend auf der Anzahl der Elemente und der Größe dieser Elemente, nicht basierend auf der Datenmenge, die an eine Anwendung zurückgegeben wird. Aus diesem Grund bleibt die Anzahl der verbrauchten Kapazitätseinheiten gleich, unabhängig davon, ob Sie alle Attribute (das Standardverhalten) oder nur einige von ihnen anfordern (mithilfe eines Projektionsausdrucks). Die Zahl ist auch gleich, unabhängig davon, ob Sie einen Filterausdruck verwenden oder nicht. Scan verbraucht eine minimale Lesekapazitätseinheit, um einen Strongly-Consistent-Lesevorgang pro Sekunde oder zwei Eventually-Consistent-Lesevorgänge pro Sekunde für ein Element von bis zu 4 KB durchzuführen. Wenn Sie ein Element lesen möchten, das größer als 4 KB ist, benötigt DynamoDB zusätzliche Leseanforderungseinheiten. Leere Tabellen und sehr große Tabellen mit einer geringen Anzahl von Partitionsschlüsseln können zusätzliche RCUs verursachen, die über die Menge der gescannten Daten hinausgehen. Dies deckt die Kosten für die Bearbeitung der Scan Anforderung ab, auch wenn keine Daten vorhanden sind.

Lesekonsistenz für Scan

Eine Scan-Operation führt standardmäßig lEventually Consistent-Lesevorgänge aus. Dies bedeutet, dass die Scan-Ergebnisse Änderungen aufgrund kürzlich abgeschlossener PutItem oder UpdateItem-Operationen, nicht wiedergeben könnten. Weitere Informationen finden Sie unter Lesekonsistenz.

Wenn Sie Strongly Consistent-Lesevorgänge benötigen, setzen Sie zum Zeitpunkt, an dem der Scan beginnt, den ConsistentRead-Parameter in der Scan-Anforderung auf true. Dadurch wird sichergestellt, dass alle Schreiboperationen, die vor Scan-Beginn abgeschlossen wurden, in die Scan-Antwort aufgenommen werden.

Die Festlegung von ConsistentRead für true kann beim Backup von Tabellen oder in Replikationsszenarien mit DynamoDB Streams hilfreich sein. Sie verwenden zuerst Scan, während ConsistentRead auf "true" eingestellt ist, um eine konsistente Kopie der Daten in der Tabelle zu erhalten. Während der Scan-Operation zeichnet DynamoDB Streams alle zusätzlichen Schreibaktivitäten auf, die in der Tabelle ausgeführt werden. Nach Abschluss der Scan können Sie die Schreibaktivität vom Stream auf die Tabelle anwenden.

Anmerkung

Beachten Sie, dass eine Scan-Operation, bei der ConsistentRead auf true festgelegt ist, doppelt so viele Lesekapazitätseinheiten verbraucht wie mit dem ConsistentRead-Standardwert (false).

Parallele Scans

Standardmäßig verarbeitet die Scan-Operation Daten sequenziell. Amazon DynamoDB gibt Daten in Schritten von 1 MB an die Anwendung zurück, und eine Anwendung führt zusätzliche Scan-Operationen aus, um die nächsten 1 MB Daten abzurufen.

Je größer die gescannte Tabelle oder der Index, desto mehr Zeit benötigt Scan um zu beenden. Außerdem kann eine sequenzielle Scan möglicherweise die bereitgestellte Lesedurchsatzkapazität nicht immer vollständig nutzen: Auch wenn DynamoDB die Daten einer großen Tabelle über mehrere physische Partitionen verteilt, kann eine Scan-Operation nur jeweils eine Partition lesen. Aus diesem Grund wird der Durchsatz einer Scan-Operation durch den maximalen Durchsatz einer einzelnen Partition beschränkt.

Um diese Probleme zu beheben, kann die Scan-Operation eine Tabelle oder einen sekundären Index in mehrere Segmente logisch unterteilen, wobei mehrere Anwendungs-Worker die Segmente parallel scannen. Jeder Worker kann ein Thread (in Programmiersprachen, die Multithreading unterstützen) oder ein Betriebssystemprozess sein. Zum Durchführen eines parallelen Scans erstellt jeder Worker eine eigene Scan-Anforderung mit den folgenden Parametern:

  • Segment – Ein Segment, das von einem bestimmten Worker gescannt werden soll. Jeder Worker sollte einen anderen Wert für Segment verwenden.

  • TotalSegments – Die Gesamtanzahl der Segmente für den parallelen Scan. Dieser Wert muss mit der Anzahl der Worker übereinstimmen, die Ihre Anwendung verwenden wird.

Das folgende Diagramm zeigt, wie eine Multithread-Anwendung eine parallele Scan-Operation mit drei Grad Parallelität ausführt.

In diesem Diagramm ruft die Anwendung drei Threads auf und weist jedem Thread eine Zahl zu. (Segmente sind nullbasiert, sodass die erste Zahl immer 0 ist.) Jeder Thread erstellt eine Scan-Anforderung, mit der Segment auf die zugewiesene Zahl und TotalSegments auf 3 eingestellt wird. Jeder Thread scannt ein zugewiesenes Segment, indem 1 MB Daten abgerufen werden, und gibt die Daten an den Haupt-Thread der Anwendung zurück.

Die Werte für Segment und TotalSegments gelten für einzelne Scan-Anforderungen. Sie können jederzeit andere Werte verwenden. Sie müssen ggf. mit diesen Werten und der Anzahl der verwendeten Worker experimentieren, bis Ihre Anwendung eine optimale Leistung erzielt.

Anmerkung

Ein paralleler Scan mit einer großen Anzahl von Workern kann leicht den gesamten bereitgestellten Durchsatz für die Tabelle oder den Index, die bzw. der gescannt wird, verbrauchen. Es ist am besten, solche Scans zu verhindern, wenn für die Tabelle oder den Index auch viele Lese- und Schreibaktivitäten von anderen Anwendungen erfolgen.

Zur Steuerung der Datenmenge, die pro Anforderung zurückgegeben wird, verwenden Sie den Parameter Limit. Auf diese Weise können Sie Situationen verhindern, in denen ein Worker den gesamten bereitgestellten Durchsatz auf Kosten aller anderen Worker verbraucht.