PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie macht man Python/PostgreSQL schneller?

Verschwenden Sie keine Zeit mit der Profilerstellung. Die Zeit ist immer in den Datenbankoperationen enthalten. Machen Sie so wenig wie möglich. Nur die minimale Anzahl von Einsätzen.

Drei Dinge.

Einer. Wählen Sie nicht immer wieder SELECT aus, um die Dimensionen Datum, Hostname und Person anzupassen. Holen Sie alle Daten EINMAL in ein Python-Wörterbuch und verwenden Sie es im Speicher. Führen Sie keine wiederholten Singleton-Auswahlen durch. Verwenden Sie Python.

Zwei. Nicht aktualisieren.

Tun Sie dies insbesondere nicht. Es ist aus zwei Gründen schlechter Code.

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

Es muss durch ein einfaches SELECT COUNT(*) FROM ... ersetzt werden. Aktualisieren Sie niemals, um einen Zähler zu erhöhen. Zählen Sie einfach die vorhandenen Zeilen mit einer SELECT-Anweisung. [Wenn Sie dies nicht mit einem einfachen SELECT COUNT oder SELECT COUNT(DISTINCT) tun können, fehlen Ihnen einige Daten – Ihr Datenmodell sollte immer korrekte vollständige Zählungen liefern. Nie aktualisieren.]

Und. Erstellen Sie niemals SQL mit Zeichenfolgensubstitution. Völlig dumm.

Wenn aus irgendeinem Grund die SELECT COUNT(*) nicht schnell genug ist (zuerst Benchmark, bevor irgendetwas lahmt), können Sie das Ergebnis der Zählung in einer anderen Tabelle zwischenspeichern. NACH all den Lasten. Führen Sie ein SELECT COUNT(*) FROM whatever GROUP BY whatever durch und füge dies in eine Zähltabelle ein. Nicht aktualisieren. Immer.

Drei. Verwenden Sie Bind-Variablen. Immer.

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

Das SQL ändert sich nie. Die gebundenen Werte ändern sich, aber die SQL ändert sich nie. Das geht VIEL schneller. Erstellen Sie SQL-Anweisungen niemals dynamisch. Niemals.