Ergebnis 1 bis 3 von 3

Thema: Performanceprobleme bei Update

  1. #1
    Pittiplatsch ist offline Neuer Benutzer
    Registriert seit
    05.05.2007
    Ort
    Leipzig
    Beiträge
    10

    Standard Performanceprobleme bei Update

    Hallo zusammen, ich muss ein paar Updates auf große Tabellen machen und das dauert viel zu lange. Zunächst zu den Tabellen:
    Code:
    CREATE TABLE verordnung_151
    (
    monat smallint NOT NULL,
    mandant smallint NOT NULL,
    lnr integer NOT NULL,
    pos smallint NOT NULL,
    ...
    autidem smallint NOT NULL,
    ...
      CONSTRAINT pk_verordnung_151 PRIMARY KEY (monat, mandant, lnr, pos) USING INDEX TABLESPACE idx
    )WITHOUT OIDS  tablespace data;
    
    
    CREATE TABLE tmp_autidem
    (
      monat smallint NOT NULL,
      mandant smallint NOT NULL,
      lnr integer NOT NULL,
      pos smallint NOT NULL,
      pzn integer NOT NULL,
      autidem smallint,
      CONSTRAINT tmp_autidem_pkey PRIMARY KEY (monat, mandant, lnr, pos) USING INDEX TABLESPACE idx
    ) 
    WITHOUT OIDS TABLESPACE data;
    Beide Tabellen sind nach dem Primärschlüssel geclustered, vacuum und analyze ist gemacht. Die Tabele Verordnung hat ca. 6,5 Mio Sätze (Monat 151). tmp_autidem 107 Mio Sätze (Monate 146 -163), da auch noch andere partitionen gemacht werden müssen.

    Nun das Update:
    Code:
    update verordnung_151 set autidem=r.autidem
    from tmp_autidem r
    where verordnung_151.monat=r.monat and verordnung_151.mandant=r.mandant
    and verordnung_151.lnr=r.lnr and verordnung_151.pos=r.pos and r.monat=151;
    Der Ausführungsplan sieht eigentlich wie erwartet aus, was den Mergejoin betrifft. Was ich hier nicht ganz verstehe ist die Sortieroperation, da die Daten ja bereits sortiert vorliegen
    Code:
    explain update ...
    Merge Join  (cost=3022261.56..3523750.32 rows=22639491 width=77)
      Merge Cond: ((verordnung_151.lnr = r.lnr) AND (verordnung_151.pos = r.pos) AND (verordnung_151.mandant = r.mandant))
      ->  Sort  (cost=1237317.83..1253720.87 rows=6561216 width=75)
            Sort Key: verordnung_151.lnr, verordnung_151.pos, verordnung_151.mandant
            ->  Seq Scan on verordnung_151  (cost=0.00..202867.20 rows=6561216 width=75)
                  Filter: (151 = monat)
      ->  Sort  (cost=1784943.73..1801730.97 rows=6714898 width=12)
            Sort Key: r.lnr, r.pos, r.mandant
            ->  Bitmap Heap Scan on tmp_autidem r  (cost=140494.86..908752.08 rows=6714898 width=12)
                  Recheck Cond: (monat = 151)
                  ->  Bitmap Index Scan on tmp_autidem_pkey  (cost=0.00..138816.14 rows=6714898 width=0)
                        Index Cond: (monat = 151)
    Das Update hat für diese Partition ca. 7 Stunden gedauert. (Zum Vergleich: der MS SQL-Server, von dem ich die Daten migriert habe braucht ca. 5 min bei etwas schlechterer Hardware.) Also irgendwas ist hier faul.
    Wenn ich mir während des Updates ein top anschaue, dann kann ich sehen, dass über 40-45% der CPU wa sind.

    Ich habe auch versucht, vorher aus tmp_autidem nur den Monat 151 herauszuziehen und auch mit exlusive Tablock zu arbeiten, leider ohne Erfolg.

    Vielleicht noch etwas zur Hardware:
    2xPIII Tualatin 1,4GHz
    2GB RAM
    Tabelspace Data und IDX liegen je auf einem RAID5 aus je 7 Platten. pg_xlog liegt auf einem separaten RAID1.

    Was kann man hier machen?

  2. #2
    akretschmer ist gerade online Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von Pittiplatsch Beitrag anzeigen

    Was kann man hier machen?
    Auf die Schnelle fällt mir da das ins Auge:

    Code:
    Seq Scan on verordnung_151  (cost=0.00..202867.20 rows=6561216 width=75)
                  Filter: (151 = monat)
    Möglicherweise könnte in extra Index auf der Monatsspalte helfen.


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    akretschmer ist gerade online Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    Auf die Schnelle fällt mir da das ins Auge:


    Andreas

    Außerdem: ein EXPLAIN ANALYSE ist hilfreicher, weil es zeigt die realen Kosten mit an.

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

Ähnliche Themen

  1. Insert, Update Trigger der Update ausführt
    Von Tentoxa im Forum Trigger und Funktionen
    Antworten: 2
    Letzter Beitrag: 21.06.2010, 11:31
  2. Problem insert into ... select - performanceprobleme.
    Von Nico im Forum SQL
    Antworten: 6
    Letzter Beitrag: 08.01.2010, 12:09
  3. Massivste Performanceprobleme unter PGSQL
    Von Exinferis im Forum SQL
    Antworten: 7
    Letzter Beitrag: 11.12.2008, 16:37
  4. Performanceprobleme mit PostgreSQL Server
    Von JSpatz im Forum Konfiguration
    Antworten: 8
    Letzter Beitrag: 03.05.2008, 12:37
  5. Aufruf von Update vor einem Update auf gleiche Tabelle
    Von Heisp im Forum Trigger und Funktionen
    Antworten: 3
    Letzter Beitrag: 26.06.2007, 14:21

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum