Ich versuche, eine linke Verknüpfung zwischen zwei Tabellen in einer PostgreSQL-Datenbank zu tun und es dauert etwa 14 Minuten zu laufen. Aus bestehenden SO-Posts scheint diese Art von Joins in der Größenordnung von Sekunden zu liegen. Daher würde ich gerne wissen, wie man die Leistung dieses Joins verbessert. Ich betreibe 64-bit
auf einer Windows 8
Maschine w/8 GB RAM
, mit pgAdmin III
. Die Tabellenstrukturen sind wie folgt:Verbessern der Leistung für einfache linke Join in PostgreSQL
Tabelle A: "parcels_qtr":
Paket (Text) | Jahr (int) | qtr (Text) | lpid (pk, Text) |
Hat 15,5 Millionen Zeilen, jede Spalte ist indiziert und "lpid" ist der Primärschlüssel. Ich führte diesen Tisch auch durch einen Standard-Vakuumprozess.
Tabelle B: "postalvac_qtr":
Paket (Text) | Jahr (int) | qtr (Text) | lpid (pk, Text) | vacCountY (int) |
Hat 618.000 Datensätze, alle Felder außer "vacCountY" sind indiziert und "lpid" ist der Primärschlüssel. Dies hat auch einen Standard-Vakuumprozess durchlaufen.
Wenn die Datenausgabe ausgeführt wird, dauert es etwa 14 Minuten. Beim Laufen mit explain (analyze, buffers)
dauert es etwas mehr als eine Minute. Erste Frage - Ist dieser Leistungsunterschied vollständig auf das Drucken der Daten zurückzuführen oder läuft hier etwas anderes?
Und zweite Frage, kann ich diese Laufzeit auf ein paar Sekunden runter?
Hier ist meine SQL-Code:
EXPLAIN (ANALYZE, BUFFERS)
select a.parcel,
a.lpid,
a.yr,
a.qtr,
b."vacCountY"
from parcels_qtr as a
left join postalvac_qtr as b
on a.lpid = b.lpid;
Und hier sind die Ergebnisse meiner Aussage erklären: https://explain.depesz.com/s/uKkK
ich postgreSQL ziemlich neu bin so Geduld und Erklärungen wäre sehr dankbar!
'Jahr (int) | qtr (Text) 'das sieht aus wie Jahr und Quartal, warum nicht stattdessen ein Datumsfeld verwenden (das Textfeld verlieren) und date_trunc() darauf ausführen? 'Alle Felder außer" vacCountY "sind indiziert und" lpid "ist der Primärschlüssel. Bitte lernen Sie etwas über Datenmodellierung, eine Datenbank soll keine Tabellenkalkulation mit Indizes sein. – joop
Hey @joop, danke für die Tipps zum Datumsfeld. Ich werde es versuchen. Ich habe Indizes für diese anderen Felder hinzugefügt, weil sie möglicherweise an Joins in zukünftigen Abfragen beteiligt sind. Welche Ressourcen schlage ich in Bezug auf die Datenmodellierung vor? Gibt es ein bestimmtes Buch oder Tutorial, das Sie im Sinn hatten? – Parker
Es ist nicht klar aus Ihrer Frage, was Ihre Tabellen bedeuten *. Die parcels_qtr sieht aus wie eine Voraggregation eines Zählfeldes "vacCountY". Was ist lpid (welches als Join-Feld verwendet wird). und was heißt 'Paket (Text) | Jahr (int) | qtr (Text) | lpid (pk, Text) | vacCountY (int) | 'gemein. Die meisten Leute hier bevorzugen einfache sql DDL-Tabellendefinitionen zu Ihrer klingonischen Notation, IMHP. – wildplasser