PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come rendi più veloce Python/PostgreSQL?

Non perdere tempo a profilare. L'ora è sempre nelle operazioni del database. Fai il meno possibile. Solo il numero minimo di inserti.

Tre cose.

Uno. Non SELEZIONARE più e più volte per conformarsi alle dimensioni Data, Nome host e Persona. Recupera tutti i dati UNA VOLTA in un dizionario Python e usalo in memoria. Non eseguire selezioni singleton ripetute. Usa Python.

Due. Non aggiornare.

In particolare, non farlo. È un codice errato per due motivi.

cursor.execute("UPDATE people SET chats_count = chats_count + 1 WHERE id = '%s'" % person_id)

Può essere sostituito con un semplice SELECT COUNT(*) FROM ... . Non aggiornare mai per incrementare un conteggio. Basta contare le righe che ci sono con un'istruzione SELECT. [Se non puoi farlo con un semplice SELECT COUNT o SELECT COUNT(DISTINCT), ti mancano alcuni dati:il tuo modello di dati dovrebbe sempre fornire conteggi completi corretti. Non aggiornare mai.]

E. Non compilare mai SQL utilizzando la sostituzione di stringhe. Completamente stupido.

Se, per qualche motivo, il SELECT COUNT(*) non è abbastanza veloce (benchmark prima, prima di fare qualsiasi cosa zoppa) puoi memorizzare nella cache il risultato del conteggio in un'altra tabella. DOPO tutti i carichi. Fai un SELECT COUNT(*) FROM whatever GROUP BY whatever e inserirlo in una tabella di conteggi. Non aggiornare. Mai.

Tre. Usa le variabili di associazione. Sempre.

cursor.execute( "INSERT INTO ... VALUES( %(x)s, %(y)s, %(z)s )", {'x':person_id, 'y':time_to_string(time), 'z':channel,} )

L'SQL non cambia mai. I valori vincolati cambiano, ma l'SQL non cambia mai. Questo è MOLTO più veloce. Non creare mai istruzioni SQL in modo dinamico. Mai.