2017-10-18 1 views
2

Ich muss mehrere Spalten aus verschiedenen Tabellen zusammenführen. Mein Code dauert ewig, um abzufragen. Ist das der richtige Weg mehrere Tabellen zusammenzuführen? Gibt es einen effizienteren Weg dies zu tun? Ich benutze PostgreSQL 9.6.5.Mehrere Spalten aus verschiedenen Tabellen zusammenführen

SELECT 
    i.id, i.hdm_id, i.tos, 
    c.itemid, c.cid, 
    pr.code, 
    p.lag 

    FROM Table1 i 
    JOIN Table2 c ON 
    i.id = c.id 

    JOIN Table3 pr ON 
    c.id = pr.id 

JOIN Table4 p ON 
pr.id = p.id ; 
+0

Suchindizes. – GurV

+1

Indizes werden nicht helfen, ganze Tabellen zu verbinden – JustMe

+0

@JustMe ist richtig, außerdem, wenn die 'id' Felder Primärschlüssel sind, werden sie trotzdem indiziert. –

Antwort

1

würde ich versuchen, Indizes erstellen Sie Ihre Abfrage abdeckt

create index ix_table1 on table1(id, hdm_id, tos) 
create index ix_table2 on table2(id, itemid) 
create index ix_table3 on table3(id, code) 
create index ix_table4 on table4(id, lag) 

Sie sollten ernsthaft über die Notwendigkeit einer solchen Abfrage denken. Benötigen Sie wirklich alle die Daten?

1

Ihr Problem ist nicht die JOINS. Es fehlen auch keine Indizes (obwohl sie helfen könnten, also sieh dir diese an). Ihr Problem besteht darin, dass Sie unterschiedslos 4 Tabellen beitreten und alle auswählen. Abhängig davon, wie viele Zeilen in jeder Zeile enthalten sind, dauert die Ausführung etwas länger.

Ich würde vorschlagen, dass Sie eingrenzen, was Sie wirklich brauchen aus diesen Tabellen (wie Reining in welche Daten Sie brauchen mit einer WHERE-Anweisung, wo angemessen).

Sie könnten auch eine Materialized View in Postgresql erstellen. Dies funktioniert wie eine normale Ansicht, aber die Ergebnisse der Abfrage werden zwischen Läufen gespeichert, sodass mehrere Läufe schneller sind, wenn sich die Daten währenddessen nicht ändern. Der Nachteil davon ist, dass Sie sie nicht direkt aktualisieren/löschen/einfügen können, also müssen Sie sich darum kümmern.

0

würde ich folgende Dinge vorschlagen:

1) für Index-Fragmentierung überprüfen und den Schritten folgen, wie hier erwähnt - https://docs.microsoft.com/en-us/sql/relational-databases/indexes/reorganize-and-rebuild-indexes

2) Bei der Verwendung von JOINS, sollten Sie auch Reihenfolge der Tabellen berücksichtigen. Welche Tabelle auch immer weniger Datensätze enthält, verwenden Sie diese zuerst. Die nächsten nachfolgenden Joins haben also weniger Datensätze zu filtern.

3) Verwenden Sie geeignete Indizes, wenn die Tabelle eine andere hat (in diesem Fall eine andere als Id).

Hoffe, das hilft.

Grüße, Jony

0

Sie versucht zu haben Beitritt direkt i.id der Tabelle 1 zu den anderen Tisch i.id ist? Du machst etwas anderes. Sie verbinden Table1.id mit Table2.id. Dann Table2.id zu Table3.id. Dann Table3.id zu Table4.id. Versuchen Sie, sich direkt an Tabelle 1 anzuschließen:

SELECT 
    i.id, i.hdm_id, i.tos, 
    c.itemid, c.cid, 
    pr.code, 
    p.lag 

    FROM Table1 i 
    JOIN Table2 c ON 
    i.id = c.id 

    JOIN Table3 pr ON 
    i.id = pr.id 

    JOIN Table4 p ON 
    i.id = p.id ; 
Verwandte Themen