Jaka jest różnica między skanowaniem a zapytaniem w dynamodb? Kiedy używasz skanowania / zapytania?

85

Operacja zapytania określona w dokumentacji DynamoDb:

Operacja kwerendy przeszukuje tylko wartości atrybutów klucza podstawowego i obsługuje podzbiór operatorów porównania na wartościach atrybutów kluczowych w celu doprecyzowania procesu wyszukiwania.

oraz operacja skanowania:

Operacja skanowania skanuje całą tabelę. Możesz określić filtry, które mają być zastosowane do wyników, aby zawęzić wartości zwracane po zakończeniu skanowania.

Który jest najlepszy na podstawie rozważań dotyczących wydajności i kosztów.

samson
źródło

Odpowiedzi:

55

Podczas tworzenia tabeli Dynamodb wybierz opcję Klucze podstawowe i Lokalne indeksy pomocnicze (LSI), aby operacja zapytania zwróciła żądane elementy.

Operacje zapytań obsługują tylko ocenę operatora równości klucza podstawowego, ale warunkową (=, <, <=,>,> =, między, początek) w kluczu sortowania.

Operacje skanowania są na ogół wolniejsze i droższe, ponieważ operacja musi iterować każdy element w tabeli, aby uzyskać żądane elementy.

Przykład:

Table: CustomerId, AccountType, Country, LastPurchase

Primary Key: CustomerId + AccountType

W tym przykładzie możesz użyć operacji Zapytanie, aby uzyskać:

  1. CustomerId z filtrem warunkowym na AccountType

Aby zwrócić:

  1. Wszyscy klienci z określonym typem konta
  2. Pozycje oparte na filtrach warunkowych według Kraju, tj. Wszyscy Klienci z USA
  3. Pozycje oparte na filtrach warunkowych według LastPurchase, czyli Wszyscy Klienci, którzy dokonali zakupu w ostatnim miesiącu

Aby uniknąć operacji skanowania na często używanych operacjach, należy utworzyć lokalny indeks pomocniczy (LSI) lub globalny indeks pomocniczy (GSI).

Przykład:

Table: CustomerId, AccountType, Country, LastPurchase

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

W tym przykładzie operacja kwerendy pozwala uzyskać:

  1. CustomerId z filtrem warunkowym na AccountType
  2. [GSI] Warunkowy filtr CustomerIds dla określonego AccountType
  3. [LSI] CustomerId z filtrem warunkowym LastPurchase
Kinman
źródło
1
jeśli Klucz podstawowy: CustomerId + AccountType (Rozumiem, że CustomerID to klucz partycji, a AccountType to klucz sortowania) Myślę, że operację zapytania można uruchomić tylko za pomocą CustomerID lub CustomerID + AccountType. Jeśli wyszukujesz tylko według typu konta, byłby to skan
Adil
1
Dzięki @Adil. Masz rację, zredagowałem swoją odpowiedź, aby to odzwierciedlić.
Kinman
34

Masz klucz partycji / klucz podstawowy tabeli dynamodb jako customer_country. Jeśli używasz zapytania, customer_countryjest polem obowiązkowym do wykonania operacji zapytania. Wszystkie filtry mogą być wykonane tylko dla elementów, które należą do customer_country.

Jeśli wykonasz skanowanie tabeli, filtr zostanie zastosowany na wszystkich kluczach partycji / kluczach podstawowych. Najpierw pobrał wszystkie dane i zastosował filtr po pobraniu z tabeli.

na przykład:

tutaj customer_countryjest klucz partycji / klucz podstawowy i idjest to klucz_sortowania

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

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

------------------------------------
  • Jeśli wykonujesz operację zapytania, dotyczy to tylko customer_countrywartości. Wartość powinna być tylko operatorem równości (=).

  • Dlatego pobierane są tylko elementy równe wartości klucza partycji / klucza podstawowego.

  • Jeśli wykonujesz operację skanowania, pobiera wszystkie elementy z tej tabeli i odfiltrowuje dane po ich pobraniu.

Uwaga: nie wykonuj operacji skanowania, ponieważ przekracza ona RCU.

OK200
źródło
Czy możesz podać źródło swojej odpowiedzi?
AlikElzin-kilaka
2
@ AlikElzin-kilaka Źródło: docs.aws.amazon.com/amazondynamodb/latest/developerguide/…
OK200
10

Zapytanie jest znacznie lepsze niż skanowanie pod względem wydajności. scan, jak sugeruje jego nazwa, przeskanuje całą tabelę. Ale musisz być świadomy klucza tabeli, klucza sortowania, indeksów i powiązanych indeksów sortowania, aby wiedzieć, że możesz użyć zapytania. jeśli filtrujesz zapytanie za pomocą:

  • klucz
  • Key & Key sort
  • indeks
  • indeks i powiązany z nim klucz sortowania

użyj zapytania! w przeciwnym razie użyj skanowania, które jest bardziej elastyczne w kwestii tego, które kolumny możesz filtrować.

NIE możesz zapytać, jeśli:

  • więcej niż 2 pola w filtrze (np. klucz, sort i indeks)
  • tylko klucz sortowania (klucza podstawowego lub indeksu)
  • zwykłe pola (nie klucz, indeks ani sort)
  • mieszany indeks i sort (indeks1 z sortowaniem indeks2) \
  • ...

dobre wyjaśnienie: https://medium.com/@amos.shahar/dynamodb-query-vs-scan-sql-syntax-and-join-tables-part-1-371288a7cb8f

Otwórz Voip
źródło
9

Jeśli chodzi o wydajność, myślę, że dobrą praktyką jest zaprojektowanie tabeli tak, aby aplikacje były używane Queryzamiast Scan. Ponieważ operacja skanowania zawsze skanuje całą tabelę, zanim odfiltruje żądane wartości, co oznacza, że ​​przetwarzanie operacji na danych, takich jak odczyt, zapis i usuwanie, zajmuje więcej czasu i miejsca. Więcej informacji można znaleźć w oficjalnym dokumencie

Liutong Chen
źródło
7

Podobnie jak w relacyjnej bazie danych.

Uzyskaj queryużywasz klucza podstawowego w wherestanie Złożoność obliczeniowa jestlog(n) jak najbardziej kluczowe struktury jest drzewo binarne.

podczas scanzapytania musisz przeskanować całą tabelę, a następnie zastosować filtr do każdej z nich, rowaby znaleźć właściwy wynik. Wydajność jest O(n). Jest dużo wolniej, jeśli twój stół jest duży.

Krótko mówiąc, spróbuj użyć, getjeśli znasz klucz podstawowy. tylko scanw najgorszym przypadku.

Pomyśl również o globalnym indeksie pomocniczym, który obsługuje różnego rodzaju zapytania na różnych kluczach, aby uzyskać docelową wydajność

Joey Trang
źródło