2012-08-29 8 views
5

Por ejemplo (usando Boto):Cuando realizo un escaneo() en Dynamodb sin filtro y recupero solo 10 objetos, ¿sigue teniendo acceso a toda la base de datos?

import boto 

db = boto.connect_dynamodb() 

table = db.get_table('MyTable') 
res = table.scan(attributes_to_get=['id'], max_results=10) 

for i in res: 
    print i 

Si tengo 1.000 objetos en mi mesa, va a escanear todos ellos, o detenerse después de 10? Si esto realmente lee los 1000 objetos, ¿cómo puedo leer solo los primeros 10?

Respuesta

3

De acuerdo con la documentación en capacity unit calculation, solo se analizarán hasta 1 MB de datos por cada solicitud.

En el caso de una operación de escaneo, no tiene el tamaño de los elementos devueltos por el escaneo, sino que es del tamaño de los elementos evaluados por Amazon DynamoDB. Es decir, para una solicitud de exploración, Amazon DynamoDB evalúa hasta 1 MB de elementos y devuelve solo los elementos que satisfacen las condiciones de exploración.

Para tablas con 'solo' 1.000 elementos, en teoría analizaría toda la tabla cada vez. Con suerte, el parámetro 'límite' (cuyo valor máximo es 100) permitirá detener el proceso antes de que se devuelvan como máximo limit elementos.

Si lo solicita no implica ninguna condición, el recuento de elementos escaneados será el número de resultados. De lo contrario, podría ser mucho, mucho mayor, pero el tamaño acumulado de los elementos escaneados no puede cruzar el límite de 1 MB.

Para las operaciones digitalizadas, Amazon considera que consume

consumed_capacity = math.ceil(sum(parsed_data_size)/1KB) 

Pero, por favor, no tome mi palabra:

import boto 
db = boto.connect_dynamodb() 

# Notice the "layer1" operation 
res = db.layer1.scan('MyTable', attributes_to_get=['id'], limit=10) 

print res['ScannedCount'] 
+0

La documentación lo hace sonar como para cada operación de escaneo(), toda la tabla se escaneará pero solo se devolverán los elementos de menos de 1 MB o menos. – ensnare

+0

Cada llamada '' Scan'' disparará el _analysis_ de hasta 1MB de elementos o '' Límite'' Items si se alcanzó antes. Sin embargo, debe llamar a '' Scan'' en toda la tabla para asegurarse de no perder una coincidencia en caso de que esté * filtrando * los resultados. – yadutaf

0

Para responder plenamente a su pregunta lo que necesita saber también: ¿Cuál es el tamaño de los artículos en Kb y cuál es la capacidad de lectura provista de su tabla?

Si escanea solo los elementos que representan la clave de índice principal (en su caso 'id') sin ninguna expresión de filtro, recibirá los primeros 10 elementos y el escaneo se detendrá.

No va a recuperar los primeros 10 elementos si:

  1. El tamaño de los elementos juntos es más grande que 1 MB, en este caso se tendrá que utilizar más iteraciones y empezar la segunda exploración con ExclusiveStartKey = resultado ['LastEvaluatedKey'].

O

  1. Si no tiene suficiente capacidad de leer aprovisionado por lo que recibirá un "no lo suficientemente excepción rendimiento aprovisionado" y tendrá que controlar el tiempo de exploración usando "límites".
Cuestiones relacionadas