¿Cuál es la diferencia entre escanear y consultar en dynamodb? ¿Cuándo usar escaneo / consulta?

84

Una operación de consulta como se especifica en la documentación de DynamoDb:

Una operación de consulta busca solo valores de atributo de clave primaria y admite un subconjunto de operadores de comparación en valores de atributo clave para refinar el proceso de búsqueda.

y la operación de escaneo:

Una operación de escaneo escanea toda la tabla. Puede especificar filtros para aplicar a los resultados para refinar los valores que se le devuelven, después del análisis completo.

Cuál se basa mejor en consideraciones de rendimiento y costos.

Sansón
fuente

Respuestas:

52

Al crear una tabla Dynamodb, seleccione Claves primarias e Índices secundarios locales (LSI) para que una operación de consulta devuelva los elementos que desea.

Las operaciones de consulta solo admiten una evaluación de operador igual de la clave principal, pero condicional (=, <, <=,>,> =, entre, comenzar) en la clave de ordenación.

Las operaciones de escaneo son generalmente más lentas y costosas ya que la operación tiene que iterar a través de cada elemento de su tabla para obtener los elementos que está solicitando.

Ejemplo:

Table: CustomerId, AccountType, Country, LastPurchase

Primary Key: CustomerId + AccountType

En este ejemplo, puede utilizar una operación de consulta para obtener:

  1. Un CustomerId con un filtro condicional en AccountType

Debería usarse una operación de escaneo para regresar:

  1. Todos los clientes con un tipo de cuenta específico
  2. Elementos basados ​​en filtros condicionales por país, es decir, todos los clientes de EE. UU.
  3. Elementos basados ​​en filtros condicionales de LastPurchase, es decir, todos los clientes que realizaron una compra en el último mes

Para evitar operaciones de escaneo en operaciones de uso frecuente, se crea un índice secundario local (LSI) o un índice secundario global (GSI).

Ejemplo:

Table: CustomerId, AccountType, Country, LastPurchase

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

En este ejemplo, una operación de consulta puede permitirle obtener:

  1. Un CustomerId con un filtro condicional en AccountType
  2. [GSI] Un filtro condicional en CustomerIds para un AccountType específico
  3. [LSI] Un CustomerId con un filtro condicional en LastPurchase
Kinman
fuente
1
si Clave principal: CustomerId + AccountType (entiendo que CustomerID es la clave de partición y AccountType es la clave de clasificación) Creo que solo puede ejecutar una operación de consulta por CustomerID o por CustomerID + AccountType. Si busca solo por AccountType, sería un escaneo
Adil
1
Gracias @Adil. Tienes razón, he editado mi respuesta para reflejar esto.
Kinman
34

Tiene la clave de partición / clave principal de la tabla dynamodb como customer_country. Si usa consulta, customer_countryes el campo obligatorio para realizar la operación de consulta. Todos los filtros se pueden hacer solo los elementos que pertenecen customer_country.

Si realiza un escaneo de tabla, el filtro se realizará en todas las claves de partición / claves primarias. Primero, obtuvo todos los datos y aplicó el filtro después de obtenerlos de la tabla.

p.ej:

aquí customer_countryestá la clave de partición / clave principal y ides la clave de clasificación

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

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

------------------------------------
  • Si realiza una operación de consulta, se aplica solo al customer_countryvalor. El valor solo debe ser operador igual (=).

  • Por lo tanto, solo se obtienen los elementos iguales a esa clave de partición / valor de clave principal.

  • Si realiza la operación de escaneo, recupera todos los elementos de esa tabla y filtra los datos después de tomarlos.

Nota: No realice una operación de escaneo que exceda su RCU.

OK200
fuente
¿Puede indicar la fuente de su respuesta?
AlikElzin-kilaka
10

La consulta es mucho mejor que la exploración, en términos de rendimiento. escanear, como su nombre lo indica, escaneará toda la tabla. Pero debe conocer bien la clave de la tabla, la clave de clasificación, los índices y los índices de clasificación relacionados para saber que puede utilizar la Consulta. si filtra su consulta usando:

  • llave
  • clave y clasificación de clave
  • índice
  • índice y su clave de clasificación relacionada

use Query! de lo contrario, utilice la exploración, que es más flexible sobre las columnas que puede filtrar.

NO puede consultar si:

  • más de 2 campos en el filtro (p. ej., clave, clasificación e índice)
  • ordenar solo clave (de clave primaria o índice)
  • campos regulares (no clave, índice ni clasificación)
  • índice mixto y orden (índice1 con tipo de índice2) \
  • ...

una buena explicación: https://medium.com/@amos.shahar/dynamodb-query-vs-scan-sql-syntax-and-join-tables-part-1-371288a7cb8f

Voip abierto
fuente
9

En términos de rendimiento, creo que es una buena práctica diseñar su tabla para que las aplicaciones la usen en Querylugar de Scan. Debido a que una operación de escaneo siempre escanea toda la tabla antes de filtrar los valores deseados, lo que significa que se necesita más tiempo y espacio para procesar operaciones de datos como leer, escribir y eliminar. Para obtener más información, consulte el documento oficial.

Liutong Chen
fuente
7

Es similar a la base de datos relacional.

Consiga queryque está utilizando una clave principal en wherecondición. La complejidad del cálculo es log(n)que la mayor parte de la estructura de claves es un árbol binario.

mientras scanconsulta, debe escanear toda la tabla y luego aplicar un filtro en cada uno rowpara encontrar el resultado correcto. La actuación es O(n). Es mucho más lento si tu mesa es grande.

En resumen, intente usar getsi conoce la clave principal. solo scanpara el peor de los casos.

Además, piense en el índice secundario global para admitir un tipo diferente de consultas en diferentes claves para obtener el objetivo de rendimiento.

Joey Trang
fuente