Digamos que tenía una tabla PostgreSQL con 5-6 columnas y unos cientos de filas. ¿Sería más efectivo usar psycopg2 para cargar la tabla completa en mi programa Python y usar Python para seleccionar las filas que quiero y ordenar las filas como deseo? ¿O sería más efectivo usar SQL para seleccionar las filas requeridas, ordenarlas y cargar solo esas filas específicas en mi programa de Python?
Por 'efectivo' me refiero en términos de:
Además, ¿cómo empezarían a variar estos factores a medida que aumenta el tamaño de la tabla? Digamos, ¿la tabla ahora tiene unos pocos millones de filas?
Casi siempre será más rápido realizar todas estas operaciones en PostgreSQL. Estos sistemas de bases de datos han sido diseñados para escalar bien para grandes cantidades de datos y están altamente optimizados para sus casos de uso típicos. Por ejemplo, no tienen que cargar todos los datos del disco para realizar la mayoría de los filtros básicos [1] .
Incluso si este no fuera el caso, la latencia de la red / el uso por sí solo sería suficiente para equilibrar esto, especialmente si estaba ejecutando la consulta con frecuencia.
En realidad, si está comparando datos que ya están cargados en la memoria con datos que se recuperan de una base de datos, entonces las operaciones en la memoria a menudo serán más rápidas. Las bases de datos tienen sobrecarga:
Los dos primeros en particular agregan sobrecarga en comparación con las operaciones en memoria equivalentes para cada consulta.
Eso no significa que las bases de datos no tengan ventajas, particularmente para consultas complejas:
La ventaja de las bases de datos no es que proporcionen el mejor rendimiento todo el tiempo. La ventaja es que proporcionan un buen rendimiento en una amplia gama de solicitudes con una interfaz sencilla (incluso si no te gusta SQL, creo que debes admitir que es más simple, más conciso y más flexible que escribir código en un lenguaje de tercera generación).
Además, las bases de datos protegen los datos a través de las propiedades ACID y otros mecanismos para respaldar la integridad de los datos.