sql >> Databasteknik >  >> RDS >> PostgreSQL

Långsam enkel uppdateringsfråga på PostgreSQL-databas med 3 miljoner rader

Jag måste uppdatera tabeller med 1 eller 2 miljarder rader med olika värden för varje rad. Varje körning gör ~100 miljoner ändringar (10%). Mitt första försök var att gruppera dem i transaktioner på 300K uppdateringar direkt på en specifik partition eftersom Postgresql inte alltid optimerar förberedda frågor om du använder partitioner.

  1. Transaktioner av en massa "UPDATE myTable SET myField=value WHEREmyId=id"
    Ger 1 500 uppdateringar/sek. vilket innebär att varje körning skulle ta minst 18 timmar.
  2. HOT uppdaterar lösning enligt beskrivningen här med FILLFACTOR=50. Ger 1 600 uppdateringar/sek. Jag använder SSD:er så det är en kostsam förbättring eftersom den fördubblar lagringsstorleken.
  3. Infoga i en temporär tabell med uppdaterat värde och slå samman dem efteråt med UPDATE...FROM Ger 18 000 uppdateringar/sek. om jag gör en VAKUUM för varje partition; 100 000 upp/s annars. Cooool.
    Här är operationssekvensen:
CREATE TEMP TABLE tempTable (id BIGINT NOT NULL, field(s) to be updated,
CONSTRAINT tempTable_pkey PRIMARY KEY (id));

Samla ett gäng uppdateringar i en buffert beroende på tillgängligt RAMNär det är fyllt, eller behöver byta tabell/partition, eller slutfört:

COPY tempTable FROM buffer;
UPDATE myTable a SET field(s)=value(s) FROM tempTable b WHERE a.id=b.id;
COMMIT;
TRUNCATE TABLE tempTable;
VACUUM FULL ANALYZE myTable;

Det betyder att en körning nu tar 1,5 timmar istället för 18 timmar för 100 miljoner uppdateringar, inklusive vakuum. För att spara tid är det inte nödvändigt att göra en dammsugare FULL i slutet, men även en snabb vanlig dammsugare är användbar för att kontrollera ditt transaktions-ID på databasen och inte få oönskad autovakuum under rusningstid.



  1. Hur kan sanitet som undkommer enstaka citattecken besegras av SQL-injektion i SQL Server?

  2. Hur hittar du radantalet för alla dina bord i Postgres

  3. Uppdatering av databasrader utan att låsa tabellen i PostgreSQL 9.2

  4. MariaDB MaxScale Load Balancing på Docker:Hantering:Del två