Ich habe da eine Datenbank mit Postings, die unter anderem folgende Tabelle
enthaelt:
| Column | Type |
| ----------------------+-----------------------------+
| idposting | integer |
| fkidpostingparent | integer |
| fkidpostingthread | integer |
| [...]
|
| Indexes:
| "posting_pkey" PRIMARY KEY, btree (idposting)
| "posting_fkidpostingparent" btree (fkidpostingparent)
| "posting_fkidpostingthread" btree (fkidpostingthread)
Nach dem initialen Einlesen einiger Mio. Datensaetze geht es nun darum, die
beiden Foreign Keys zu befuellen (was beim Befuellen wegen zufaelliger
Reihenfolge nicht moeglich war). Die Parents waren relativ zuegig erledigt.
Fure die Threads habe ich in meiner Naivitaet einmal:
| UPDATE posting
| SET fkidpostingthread=p2.fkidpostingthread
| FROM posting p2
| WHERE posting.fkidpostingparent=p2.idposting
| AND posting.fkidpostingthread IS NULL
| AND p2.fkidpostingthread IS NOT NULL
versucht (klarerweise iterativ anzuwenden). An der ersten Iteration
arbeitet PostgreSQL nun seit rund 30 Stunden... das muss doch deutlich
schneller gehen?
Explain sagt mir:
| QUERY PLAN
| -----------------------------------------------------------------------------------------
| Update on posting (cost=3414895.21..9530992.01 rows=4470847 width=868)
| -> Hash Join (cost=3414895.21..9530992.01 rows=4470847 width=868)
| Hash Cond: (posting.fkidpostingparent = p2.idposting)
| -> Seq Scan on posting (cost=0.00..3263193.96 rows=11995736 width=858)
| Filter: (fkidpostingthread IS NULL)
| -> Hash (cost=3263193.96..3263193.96 rows=8727060 width=14)
| -> Seq Scan on posting p2 (cost=0.00..3263193.96 rows=8727060 width=14)
| Filter: (fkidpostingthread IS NOT NULL)
Klar - nur bei 1/3 der Postings hat die Zuordnung initial geklappt, also
wird der Index ignoriert, da muss ich erst einmal durch. Aber weshalb der
zweite Sequential Scan ueber die ganze Tabelle? Waere es nicht sinnvoller,
die Ergebnisse des ersten Scans der Reihe nach via Index nachzuschlagen und
_dann_ zu pruefen, ob das Feld NULL ist oder nicht? Und wenn ja, wie lege
ich ihm das nahe?
Servus,
Stefan
--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Offizieller Erstbesucher(TM) von mmeike
Stefan: der Grund, den man braucht!
(Sloganizer)