sql >> Database >  >> RDS >> PostgreSQL

Hoe maak je Python / PostgreSQL sneller?

Verspil geen tijd aan profilering. De tijd is altijd in de databasebewerkingen. Doe zo min mogelijk. Alleen het minimum aantal inserts.

Drie dingen.

Een. SELECTEER niet steeds opnieuw om te voldoen aan de dimensies Datum, Hostnaam en Persoon. Haal alle gegevens EENMAAL op in een Python-woordenboek en gebruik het in het geheugen. Doe geen herhaalde singleton-selecties. Gebruik Python.

Twee. Niet bijwerken.

Doe dit vooral niet. Het is om twee redenen slechte code.

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

Het wordt vervangen door een eenvoudige SELECT COUNT(*) FROM ... . Nooit updaten om een ​​telling te verhogen. Tel gewoon de rijen die er zijn met een SELECT-instructie. [Als u dit niet kunt doen met een eenvoudige SELECT COUNT of SELECT COUNT(DISTINCT), mist u enkele gegevens -- uw gegevensmodel moet altijd correcte volledige tellingen bieden. Nooit updaten.]

En. Bouw nooit SQL met behulp van tekenreeksvervanging. Helemaal dom.

Als om de een of andere reden de SELECT COUNT(*) niet snel genoeg is (eerst benchmarken, voordat u iets stoms doet), kunt u het resultaat van de telling in een andere tabel cachen. NA alle ladingen. Doe een SELECT COUNT(*) FROM whatever GROUP BY whatever en plaats dit in een tabel met tellingen. Niet bijwerken. Ooit.

Drie. Gebruik bindvariabelen. Altijd.

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

De SQL verandert nooit. De waarden zijn gebonden aan verandering, maar de SQL verandert nooit. Dit is VEEL sneller. Bouw SQL-instructies nooit dynamisch op. Nooit.



  1. IO-fout:de netwerkadapter kon geen verbinding tot stand brengen - met Oracle 11gR2. Verbinding maken met SQL-ontwikkelaar

  2. Oracle 10g recursieve query

  3. Laad inhoud van MySQL op scrollen met AJAX-bericht

  4. Controleer Tekenreeks is een geldige datum of niet