Sto eseguendo un'operazione batch su tutte le righe di un database. Ciò comporta la selezione di ogni singolo modello e l'esecuzione di qualcosa. Ha senso dividerlo in pezzi e farlo a pezzetti.Il modo migliore per elaborare il database in blocchi con Django QuerySet?
Attualmente sto usando Paginator, perché è conveniente. Ciò significa che ho bisogno di un ordinamento sui valori in modo che possano essere sfogliati in ordine. Questo genera istruzioni SQL che hanno clausole order
e limit
e penso che Postgres stia ordinando l'intera tabella (anche se non posso affermare di avere alcuna conoscenza sugli interni). Tutto quello che so è che il database è di circa il 50% della CPU e penso che sia troppo alto solo per fare select
s.
Qual è il modo migliore per scorrere l'intera tabella in modo RDMBS/CPU-friendly?
Presupponendo che il contenuto del database non cambi durante l'operazione batch.
Questo presuppone che i record vengono restituiti nello stesso ordine senza un 'sort' clausola. È corretto? Inoltre, se ho un ordinamento predefinito nella mia classe 'Meta' posso in qualche modo rimuoverlo per la query? – Joe
@Joe: In pratica si ottengono gli stessi record, ma non ordinati. Se ci sono lacune nello spazio ID, il numero di record restituiti può essere inferiore al previsto per ogni chiamata. Mentre con LIMIT/OFFSET si ottiene un numero fisso di righe ordinate (tranne l'ultima chiamata per tabella). Non so come gestire la classe 'Meta', ma * devi * ordinare le tue righe per LIMIT/OFFSET. –
Erwin, mi dispiace davvero di non aver letto correttamente la risposta. Sei sicuro che sia più veloce? la clausola 'between' può sicuramente funzionare solo se gli ID sono già ordinati, o esegue una scansione di una tabella intera ogni volta? – Joe