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

Hvordan gør du Python / PostgreSQL hurtigere?

Spild ikke tid på at profilere. Tiden er altid i databaseoperationerne. Gør så få som muligt. Kun det mindste antal indsatser.

Tre ting.

En. VÆLG ikke igen og igen for at tilpasse dimensionerne Dato, Værtsnavn og Person. Hent alle data EN gang ind i en Python-ordbog og brug dem i hukommelsen. Foretag ikke gentagne singleton-valg. Brug Python.

To. Opdater ikke.

Specifikt, gør ikke dette. Det er dårlig kode af to årsager.

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

Den erstattes med en simpel SELECT COUNT(*) FRA ... . Opdater aldrig for at øge et antal. Bare tæl de rækker, der er der, med en SELECT-sætning. [Hvis du ikke kan gøre dette med en simpel SELECT COUNT eller SELECT COUNT(DISTINCT), mangler du nogle data -- din datamodel bør altid give korrekte fuldstændige tællinger. Opdater aldrig.]

Og. Byg aldrig SQL ved hjælp af strengsubstitution. Fuldstændig dum.

Hvis SELECT COUNT(*) af en eller anden grund er ikke hurtig nok (benchmark først, før du gør noget dårligt), kan du cache resultatet af optællingen i en anden tabel. EFTER alle belastningerne. Lav en SELECT COUNT(*) FROM whatever GROUP BY whatever og indsæt dette i en tabel med tæller. Opdater ikke. nogensinde.

Tre. Brug bindingsvariabler. Altid.

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

SQL ændres aldrig. Værdierne er bundet i ændringer, men SQL ændres aldrig. Det her er MEGET hurtigere. Byg aldrig SQL-sætninger dynamisk. Aldrig.



  1. Hvilket versionsdesignmønster vil du anbefale

  2. SQL, der kombinerer to kolonner til en variabel

  3. Deaktiver bestemt række i JTable ved hjælp af data fra databasen

  4. Forespørgsel for at få top 2 og 3. poster fra en tabel