Estoy ejecutando una operación por lotes en todas las filas de una base de datos. Esto implica seleccionar cada modelo y hacer algo al respecto. Tiene sentido dividir esto en pedazos y hacerlo por partes.¿La mejor manera de procesar la base de datos en fragmentos con Django QuerySet?
Actualmente estoy usando Paginator, porque es conveniente. Esto significa que necesito un pedido de los valores para que puedan ser ordenados en orden. Esto genera sentencias SQL que tienen las cláusulas order
y limit
, y para cada fragmento creo que Postgres puede clasificar la tabla completa (aunque no puedo afirmar que tenga ningún conocimiento sobre las internas). Todo lo que sé es que la base de datos está en alrededor del 50% de CPU y creo que es demasiado alta para estar haciendo select
s.
¿Cuál es la mejor manera de iterar en toda la tabla de manera RDMBS/CPU?
Suponiendo que el contenido de la base de datos no cambia durante la operación por lotes.
Esto supone que los registros se devuelven en el mismo orden y sin una 'sort' cláusula. ¿Es esto correcto? Además, si tengo una clasificación predeterminada en mi clase 'Meta', ¿puedo eliminarla de alguna manera para la consulta? – Joe
@Joe: Básicamente obtienes los mismos registros, pero no ordenados. Si hay espacios en su espacio de ID, la cantidad de registros devueltos puede ser menor de lo esperado para cada llamada. Mientras que con LIMIT/OFFSET obtienes un número fijo de filas ordenadas (excepto la última llamada por tabla). No sé cómo manejar la clase 'Meta', pero * necesita * ordenar sus filas para LIMIT/OFFSET. –
Erwin, lamento mucho no haber leído su respuesta correctamente. ¿Estás seguro de que esto es más rápido? la clausula 'between' seguramente solo puede funcionar si los identificadores ya están ordenados, o si realiza un escaneo completo de la tabla cada vez? – Joe