You don't have access to this class

Keep learning! Join and start boosting your career

Aprovecha el precio especial y haz tu profesión a prueba de IA

Antes: $249

Currency
$209
Suscríbete

Termina en:

0 Días
10 Hrs
16 Min
1 Seg
Curso Práctico de Bases de Datos en AWS

Curso Práctico de Bases de Datos en AWS

Carlos Andrés Zambrano Barrera

Carlos Andrés Zambrano Barrera

Demo de operaciones Scan y Query en DynamoDB

27/32
Resources

How are scan and query operations performed in DynamoDB?

DynamoDB, a NoSQL database service from AWS, offers powerful capabilities for handling large volumes of data. By understanding how this service works, you can optimize queries and improve application performance. Two fundamental operations in DynamoDB are scan and query, each with its own specific characteristics and applications.

What is a scan operation?

The scan operation allows to traverse the entire DynamoDB table, evaluating each item according to the given parameters or filters. Its main focus is filtering, providing robust functionality but, given its scope, it may not always be the most efficient option:

  • Full scope: scans all records in the table, which can impact performance when dealing with large tables.
  • Flexibility in filtering: Allows creating multiple filters to refine the results according to specific needs.
  • Lack of efficiency: Due to the complete scanning of the table, this operation can be slow and costly if not handled properly.

How does a query operation improve performance?

In contrast, the query operation focuses on accessing a subset of the data, based on a primary key and, optionally, a secondary key. This allows faster and more efficient access to the data.

  • Use of keys: Requires at least one primary key to operate, which limits the scope of the scanned data and improves performance.
  • Accurate filters: In addition to improved key access, additional filters can be included to further refine results.
  • Sorting: Provides the ability to sort results in ascending or descending order, making it easier to access relevant data first.
  • Specific attributes: Allows you to specify projected attributes to limit the data returned, reducing the cost of transfer and processing.

Example of query and scan operation in the DW console

To execute these operations from the AWS console, select the desired table - for example, a table of workers - and proceed to select the required operation:

  • Console Usage: For a scan, you simply define the filters and run the operation.
  • Query requirements: It is mandatory to provide a key (ID) that matches the table structure; once defined, additional filters can be added to refine the search.

What are the advanced utilities of these operations?

Beyond the basic functions, DynamoDB offers advanced features to handle queries and improve data management.

  • Export and TTL management: Allows exporting queries and managing the Time To Live (TTL) of the data.
  • Data Limiting and Duplication: Provides tools to limit and duplicate queries according to specific application requirements.

In summary, understanding scan and query operations and their applications in DynamoDB is crucial to optimize the performance and efficiency of queries in a NoSQL database. By taking advantage of their advanced features, it is possible to create robust and efficient applications.

Contributions 11

Questions 5

Sort by:

Want to see more contributions, questions and answers from the community?

Si con la operación “query” el atributo de partición es obligatorio, no es muy útil usarlo para consultar por ejemplo todos los usuarios que tengan una edad, porque cada usuario tendría un id diferente. Quedaríamos solo con la operación “scan” como única alternativa para hacer búsquedas.

Alguien me puede aclarar cuál es la diferencia al seleccionar atributos: todos o proyectado? Al momento de hacer una consulta…

Aquí tienes una **demo práctica** de las operaciones `Scan` **y** `Query` en **Amazon DynamoDB** usando **Python (boto3)**. ## **📌 1. Configuración Inicial** Antes de ejecutar los ejemplos, asegúrate de: ✅ Tener **AWS CLI** configurado con las credenciales correctas. ✅ Instalar **boto3** en tu entorno: pip install boto3 ✅ Tener una **tabla DynamoDB** llamada `"Pedidos"`, con: * **Clave de Partición (PK):** `pedido_id` * **Clave de Ordenación (SK):** `fecha` Ejemplo de datos en la tabla **Pedidos**: **pedido\_id (PK)fecha (SK)clientemonto**P0012025-03-10Juan100 USDP0012025-03-12Juan150 USDP0022025-03-11Ana200 USD ## **📌 2. Conectando a DynamoDB en Python** import boto3 \# Conectar con DynamoDB dynamodb = boto3.resource('dynamodb') \# Definir la tabla table = dynamodb.Table('Pedidos') ## **📌 3.** `SCAN`**: Buscar Todos los Elementos** 🚨 `Scan` **recorre toda la tabla**, por lo que es **ineficiente en tablas grandes**. response = table.scan() \# Mostrar los resultados items = response\['Items'] for item in items: print(item) 📌 **Salida esperada:** \[ {"pedido\_id": "P001", "fecha": "2025-03-10", "cliente": "Juan", "monto": 100}, {"pedido\_id": "P001", "fecha": "2025-03-12", "cliente": "Juan", "monto": 150}, {"pedido\_id": "P002", "fecha": "2025-03-11", "cliente": "Ana", "monto": 200} ] ## **📌 4.** `SCAN` **con Filtros** Podemos aplicar un `FilterExpression` para reducir los resultados. Ejemplo: Buscar **pedidos con monto mayor a 120 USD**. response = table.scan( FilterExpression="monto > :monto", ExpressionAttributeValues={":monto": 120} ) items = response\['Items'] print(items) 📌 **Salida esperada:** \[ {"pedido\_id": "P001", "fecha": "2025-03-12", "cliente": "Juan", "monto": 150}, {"pedido\_id": "P002", "fecha": "2025-03-11", "cliente": "Ana", "monto": 200} ] ❗ **Nota:** `Scan` sigue recorriendo **toda la tabla**, solo filtra los datos después de leerlos. ## **📌 5.** `QUERY`**: Búsqueda Eficiente** 🚀 `Query` **es más rápido que** `Scan`, ya que solo busca los elementos con una **clave de partición específica**. ### 🔹 **Ejemplo 1: Buscar pedidos de** `P001` response = table.query( KeyConditionExpression="pedido\_id = :pedido", ExpressionAttributeValues={":pedido": "P001"} ) items = response\['Items'] print(items) 📌 **Salida esperada:** \[ {"pedido\_id": "P001", "fecha": "2025-03-10", "cliente": "Juan", "monto": 100}, {"pedido\_id": "P001", "fecha": "2025-03-12", "cliente": "Juan", "monto": 150} ] ### 🔹 **Ejemplo 2:** `Query` **con Rango de Fechas** Si queremos pedidos **de "P001" a partir del 2025-03-11**, usamos **rango en** `SK`: response = table.query( KeyConditionExpression="pedido\_id = :pedido AND fecha >= :fecha", ExpressionAttributeValues={ ":pedido": "P001", ":fecha": "2025-03-11" } ) items = response\['Items'] print(items) 📌 **Salida esperada:** \[ {"pedido\_id": "P001", "fecha": "2025-03-12", "cliente": "Juan", "monto": 150} ] ### 🔹 **Ejemplo 3:** `Query` **con Filtros** Podemos agregar **filtros en atributos secundarios** (ej. `monto > 120`), aunque DynamoDB **sigue trayendo todos los elementos de la PK** antes de filtrarlos. response = table.query( KeyConditionExpression="pedido\_id = :pedido", FilterExpression="monto > :monto", ExpressionAttributeValues={ ":pedido": "P001", ":monto": 120 } ) items = response\['Items'] print(items) 📌 **Salida esperada:** \[ {"pedido\_id": "P001", "fecha": "2025-03-12", "cliente": "Juan", "monto": 150} ] ## **📌 6. Paginación en** `Scan` **y** `Query` Si hay **muchos resultados**, DynamoDB **devuelve solo 1 MB** de datos a la vez y usa `LastEvaluatedKey` para continuar. items = \[] response = table.scan() while "LastEvaluatedKey" in response: items.extend(response\['Items']) response = table.scan(ExclusiveStartKey=response\["LastEvaluatedKey"]) print(items) Lo mismo aplica para `Query`: items = \[] response = table.query( KeyConditionExpression="pedido\_id = :pedido", ExpressionAttributeValues={":pedido": "P001"} ) while "LastEvaluatedKey" in response: items.extend(response\['Items']) response = table.query( KeyConditionExpression="pedido\_id = :pedido", ExpressionAttributeValues={":pedido": "P001"}, ExclusiveStartKey=response\["LastEvaluatedKey"] ) print(items) ## **📌 7.** `Query` **en Índices Secundarios (GSI)** Si queremos consultar por otro atributo (ej. `cliente`), necesitamos un **Índice Secundario Global (GSI)**. Ejemplo: GSI con **PK =** `cliente` **y SK =** `fecha`. response = table.query( IndexName="ClienteIndex", KeyConditionExpression="cliente = :cliente", ExpressionAttributeValues={":cliente": "Juan"} ) items = response\['Items'] print(items) ## **📌 Conclusión** ✅ **Usa** `Query` **en lugar de** `Scan` **siempre que sea posible**. ✅ **Filtra con** `KeyConditionExpression` **para optimizar búsquedas**. ✅ **Usa** `FilterExpression` **solo si necesitas filtrar después de consultar**. ✅ **Usa paginación (**`LastEvaluatedKey`**) para manejar grandes volúmenes de datos**. ✅ **Aprovecha los Índices Secundarios (**`GSI`**,** `LSI`**) para mejorar rendimiento**.
Información resumida de esta clase \#EstudiantesDePlatzi * Practicar es muy importante para reforzar lo aprendido * las operaciones Scan no son eficientes * Las operaciones Query son eficientes * Podemos usar la SDk para hacer las búsquedas

Sin lugar a duda las operaciones tipo Query son más optimas ya que permite refinar la Data con opciones de busqueda mas refinadas.

DynamoDB es más como un redis, pero que parece Mongo, la consulta “query” a mi parecer es muy inútil, casi siempre te vas a ver obligado a usar Scan.

depende de lo que se necesite se puede usar scan o queries., aunque un query es mucho mas eficiente

interesante vamos a probar 😃

¿Se puede hacer un query cuando no tengo identificado el valor de la clave de partición? Usando la tabla de ejemplo del video, digamos que todos los trabajadores se llamen ‘Pedro’. ¿En ese caso sólo puedo hacer un Scan o también se puede un Query?

Excelente!

Dado que la consola del profesor esta en español no se nota la diferencia, en el dropdown que esta del lado izquierdo están las operaciones:
-Scan
-Query