2012-08-29 7 views
5

Per esempio (utilizzando Boto):Quando eseguo una scansione() in Dynamodb senza filtro e recupero solo 10 oggetti, accede ancora all'intero database?

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 

Se ho 1.000 oggetti in mio tavolo, sarà la scansione di tutti loro, o interrompere dopo 10? Se questo effettivamente legge tutti i 1.000 oggetti, come posso averlo letto solo i primi 10?

risposta

3

In base alla documentazione su capacity unit calculation, verranno analizzati solo 1 MB di dati per singola richiesta.

In caso di un'operazione di scansione, non è la dimensione degli elementi restituiti dalla scansione, piuttosto è la dimensione degli elementi valutati da Amazon DynamoDB. Cioè, per una richiesta di scansione, Amazon DynamoDB valuta fino a 1 MB di articoli e restituisce solo gli articoli che soddisfano la condizione di scansione.

Per le tabelle con "solo" 1.000 articoli, in teoria ogni volta viene analizzato tutto il tavolo. Si spera che il parametro "limite" (di cui il valore massimo è 100), consentirà di arrestare il processo in precedenza in modo che vengano restituiti al massimo gli articoli limit.

Se la richiesta non comporta alcuna condizione, il numero di risultati scansionati sarà il numero di risultati. Altrimenti, potrebbe essere molto, molto più grande ma la dimensione accumulata degli elementi scansionati non può superare il limite di 1MB.

Per le operazioni sottoposte a scansione, Amazon considerato che avete consumato

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

Ma per favore, non prendere la mia parola su di esso:

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 documentazione suona come per ogni operazione scan(), l'intera tabella verrà scansionata ma verranno restituiti solo gli elementi inferiori a 1 MB o inferiori al limite. – ensnare

+0

Ogni chiamata '' Scan'' attiverà _analysis_ fino a 1MB di elementi o oggetti '' Limit'' se raggiunti prima. Tuttavia, devi richiamare '' Scan'' sull'intera tabella per essere certo di non perdere una corrispondenza nel caso in cui tu * filtri * i risultati. – yadutaf

0

Per rispondere pienamente alla tua domanda è necessario sapere anche: Qual è la dimensione degli articoli in Kb e qual è la capacità di lettura approvata della tua tabella.

Se si esegue la scansione solo degli elementi che rappresentano la chiave dell'indice principale (nel proprio caso 'id') senza alcuna espressione di filtro, si riceveranno i primi 10 elementi e la scansione si fermerà.

Non recupererà i primi 10 articoli se:

  1. La dimensione degli elementi insieme è più grande di 1 MB, in questo caso è necessario utilizzare più iterazioni e avviare la seconda scansione con ExclusiveStartKey = risultato ['LastEvaluatedKey'].

O

  1. Se non si dispone di sufficiente capacità di leggere il provisioning in modo riceverai un "eccezione non basta il throughput provisioning" e avrà bisogno di controllare i tempi di scansione usando "limiti".
Problemi correlati