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

AScanIn Amazon DynamoDB liest jedes Element einer Tabelle oder eines 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 Parameter ProjectionExpression 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 einzelneScan-Anforderung kann bis zu an Daten abrufen. Optional kann DynamoDB 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-Operation 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.

AScan-Operation kann bis zu 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, Bedingungsausdrücke.

Beispiel

Beim folgenden Beispiel mit der AWS Command Line Interface (AWS CLI) wird die Thread-Tabelle gescannt. Es werden nur die Elemente zurückgegeben, die von einem bestimmten Benutzer zuletzt übermittelt wurden.

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

Die Anzahl der Elemente in der Ergebnismenge begrenzen

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 aus 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, womit die nicht übereinstimmenden verworfen werden. Das letzte Scan-Ergebnis enthält sechs Elemente oder weniger, je nachdem, wie viele Elemente gefiltert wurden.

Wechseln der Ergebnisse

DynamoDBpaginiertdie Ergebnisse vonScanverwenden. Bei der Paginierung wird dieScan-Ergebnisse werden 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 einzelneScanGibt nur eine Ergebnismenge zurück, die 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 Parameter ExclusiveStartKey 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 dieses Verhalten mit der AWS CLI anzeigen. DieAWS CLIsendet Low-Level-ScanAnforderungen an DynamoDB, wiederholt, bisLastEvaluatedKeyin den Ergebnissen nicht mehr vorhanden ist. Betrachten Sie das folgende AWS CLI-Beispiel, das die gesamte Movies-Tabelle scannt, jedoch nur die Filme eines bestimmten Genres 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

In der Regel verarbeitet AWS CLI die Paginierung automatisch. In diesem Beispiel begrenzt der Parameter --page-size der AWS CLI jedoch die Anzahl von Elementen pro Seite. Der Parameter --debug druckt Low-Level-Informationen zu Anforderungen und Antworten.

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. DieAWS CLIgibt dann einen anderenScan-Anforderung an DynamoDB. 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

DieAWSDynamoDB-Antworten verarbeiten die -Low-Level-Antworten (einschließlich des Vorhandenseins oder Fehlens vonLastEvaluatedKey) und bieten verschiedene Abstraktionen zum PaginierenScan-Ergebnisse. Zum Beispiel bietet die SDK for Java Dokumentschnittstellejava.util.IteratorSo können Sie die Ergebnisse nacheinander durchgehen.

Codebeispiele in verschiedenen Programmiersprachen finden Sie unterAmazon DynamoDB — Handbuch Erste Schritteund dieAWSSDK-Dokumentation für Ihre Sprache.

Zählen der Elemente in den Ergebnisse

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

  • ScannedCount— Die Anzahl der ausgewerteten Elemente, bevorScanFilterangewendet 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 verbleibenNachEin Filterausdruck (falls vorhanden) angewendet wurde.

Anmerkung

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

Wenn die Größe desScanErgebnismenge größer als 1 MB ist,ScannedCountundCount— nur eine Teilmenge der Gesamtelemente darstellen. Sie müssen mehrere Scan-Operationen ausführen, um alle Ergebnisse abzurufen (siehe Wechseln der Ergebnisse).

Jede Scan-Antwort enthält die ScannedCount- und Count-Werte 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 der Werte ScannedCount und Count vornehmen.

Durch die Abfrage verbrauchte Kapazitätseinheiten

Sie haben folgende MöglichkeitenScanjede Tabelle oder sekundären Index.Scan-Operationen verbrauchen Lesekapazitätseinheiten wie folgt.

Mögliche Scan von ... 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 von verbrauchten Lesekapazitätseinheiten zusammen mit der verbrauchten Kapazität für jede aufgerufene Tabelle und jeden aufgerufenen Index an.

DynamoDB berechnet die Anzahl von verbrauchten Lesekapazitätseinheiten basierend auf der Elementgröße, nicht der Menge der Daten, die an eine Anwendung zurückgegeben werden. 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 Anzahl ist unabhängig davon, ob Sie einen Filterausdruck verwenden oder nicht, gleich.

Lesekonsistenz für Scan

Eine Scan-Operation führt standardmäßig Eventually Consistent-Lesevorgänge durch. 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 true-Anforderung auf TrueScan. Dadurch wird sichergestellt, dass alle Schreiboperationen, die vor Scan-Beginn abgeschlossen wurden, in die Scan-Antwort aufgenommen werden.

Festlegen vonConsistentReadauftrueBei der Sicherung von Tabellen oder in Replikationsszenarien kann in Verbindung mitDynamoDB Streams. Sie verwenden zuerst Scan, während ConsistentRead auf "true" eingestellt ist, um eine konsistente Kopie der Daten in der Tabelle zu erhalten. Während derScanZeichnet DynamoDB Streams alle zusätzlichen Schreibaktivitäten auf, die in der Tabelle ausgeführt werden. Nach Abschluss der Scan-Operation können Sie die Schreibaktivität von dem Stream auf die Tabelle anwenden.

Anmerkung

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

Parallele Scans

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

Je größer die gescannte Tabelle oder der Index, desto mehr ZeitScanbenötigt, um zu vervollständigen. Darüber hinaus wird eine sequentielleScanmöglicherweise nicht immer in der Lage sein, die bereitgestellte Lese-Durchsatzkapazität vollständig zu nutzen: Obwohl DynamoDB die Daten einer großen Tabelle über mehrere physische Partitionen verteilt, wird einScan-Operation kann 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, wird dieScanEine -Operation kann eine Tabelle oder einen Sekundärindex in mehrere-Segmente, wobei mehrere Application Worker die Segmente parallel scannen. Bei einem Worker kann es sich um einen Thread (in Programmiersprachen, die Multithreading unterstützen) oder einen Betriebssystemprozess handeln. 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 identisch sein, die Ihre Anwendung verwendet.

Das folgende Diagramm zeigt, wie eine Multithread-Anwendung eine parallele -Operation ausführtScanmit drei Graden der Parallelität.

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 gibt eineScanAnforderungseinstellungenSegmentauf die angegebene Nummer und die EinstellungTotalSegments3. Jeder Thread scannt ein zugewiesenes Segment, indem Daten abgerufen werden, und gibt die Daten an den Haupt-Thread der Anwendung zurück.

Die Werte fürSegmentundTotalSegmentsFür einzelne geltenScan-Anforderungen und 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.

Verwenden Sie zum Steuern der Datenmenge, die pro Anforderung zurückgegeben wird, dieLimit-Parameter. Auf diese Weise können Sie Situationen verhindern, in denen ein Worker den gesamten bereitgestellten Durchsatz auf Kosten aller anderen Worker verbraucht.