No pierda el perfil del tiempo. El tiempo siempre está en las operaciones de la base de datos. Haz lo menos posible. Solo el número mínimo de inserciones.
Tres cosas.
Uno. No SELECCIONE una y otra vez para conformar las dimensiones de Fecha, Nombre de host y Persona. Obtenga todos los datos UNA VEZ en un diccionario de Python y úselos en la memoria. No haga repetidas selecciones de singleton. Utiliza Python.
Dos. No actualizar
Específicamente, no hagas esto. Es un código malo por dos razones.
cursor.execute("UPDATE people SET chats_count = chats_count + 1 WHERE id = '%s'" % person_id)
Se sustituirá por un simple SELECT COUNT (*) FROM .... Nunca actualice para incrementar un conteo. Simplemente cuente las filas que están allí con una instrucción SELECT. [Si no puede hacer esto con un simple SELECT COUNT o SELECT COUNT (DISTINCT), le faltan algunos datos; su modelo de datos siempre debe proporcionar recuentos completos correctos. Nunca actualizar.]
Y. Nunca construyas SQL usando la sustitución de cadenas. Completamente tonto.
Si, por algún motivo, el SELECT COUNT(*)
no es lo suficientemente rápido (en primer lugar, como punto de referencia, antes de hacer cualquier cosa) puede almacenar en caché el resultado del recuento en otra tabla. DESPUÉS de todas las cargas. Haz un SELECT COUNT(*) FROM whatever GROUP BY whatever
e inserta esto en una tabla de conteos. No actualizar Nunca.
Tres. Usar variables de vinculación. Siempre.
cursor.execute("INSERT INTO ... VALUES(%(x)s, %(y)s, %(z)s)", {'x':person_id, 'y':time_to_string(time), 'z':channel,})
El SQL nunca cambia. Los valores vinculados en cambio, pero el SQL nunca cambia. Esto es MUCHO más rápido. Nunca construyas declaraciones SQL dinámicamente. Nunca.
La actualización se ha realizado porque más tarde on (en una aplicación de Ruby on Rails) Quiero encontrar al instante cuántas líneas tiene un usuario. Este número teóricamente nunca debería estar equivocado, y será más rápido. La sintaxis de la variable de vinculación es incorrecta (por lo que parece para mi psycopg2), ¿obtuve algo que funcionaría? –
¿Has leído mi comentario en mi otra respuesta sobre la sintaxis de la variable de enlace específico de psycopg2? –
Un recuento selectivo (*) en una tabla que tiene un índice (cualquier índice debería ser suficiente) es una operación muy rápida ya que la cantidad de elementos se almacena directamente en el índice. Seleccionar un recuento actualizado previamente no debería ser más rápido. – gooli