2017-12-05 3 views
0

Ich habe 6 Tabellen. Sie alle können Millionen und Abermillionen von Datenzeilen haben. Alle Tabellen haben Spalten object_id, changer_id, date_created.Kombinieren Abfragen auf mehrere Tabellen mit den gleichen Spalten in einer Abfrage

Ich brauche eine Abfrage auf alle Tabellen

SELECT object_id 
FROM table# 
WHERE changer_id=someId 
AND date_created > dateA 
AND dateCreated < dateB 

oder seine grails machen gleichwertig

table#.createQuery().list{ 
     projections{property('object_id')} 
     eq('changer_id', someId) 
     ge('dateCreated' dateA) 
     le('dateCreated', dateB) 
} 

gleiche Abfrage auf allen 6 Tischen gemacht werden, und dann sind die Ergebnisse kombiniert und alle Duplikate werden entfernt.

Ich verwende nicht zwischen, da DateB nicht immer existiert, so würde es weggelassen werden.

Gibt es eine Möglichkeit, diese Abfrage in einzelne Abfrage über 6 Tabellen oder auf andere Weise zu kombinieren, um es schneller als 6 separate Abfragen zu machen?

+0

eine Union Abfrage könnte tun, dass https://www.postgresql.org/docs/current/static /queries-union.html - Am Ende kann man die DataSource immer selbst machen. – cfrick

+0

@cfrick Ich "kann immer die Datenquelle"? Ich denke, dass einige Wörter fehlen. Und mit union wird es immer noch 6 verschiedene Queries machen, am Ende kombiniert es sie einfach, ist es etwas schwächer als die 6 Abfragen getrennt zu machen und sie dann zu kombinieren? –

+0

"Sie können immer den DS injizieren"; und am wahrscheinlichsten, dass es schneller ist, weil die DB die ganze Arbeit erledigt und nur die geringste Menge an Daten zurückgibt. aber natürlich: leistung muss gemessen werden und nicht cargo culted. – cfrick

Antwort

0

SQL Vererbung:

vorausgesetzt, Ihre Tabellen sind table1, table2, etc,

Setup: dies einmal tun:

create table combined (like table1); 

alter table table1 inherits combined; 
alter table table2 inherits combined; 
alter table table3 inherits combined; 
alter table table4 inherits combined; 
alter table table5 inherits combined; 
alter table table6 inherits combined; 

die Abfrage, tun dies oft wie nötig:

SELECT object_id 
FROM combined 
WHERE changer_id=someId 
AND date_created > dateA 
AND dateCreated < dateB 

postgresql wird intern generieren Gewerkschaften benötigt.

Ich gehe davon aus, dass alle Tabellen die gleichen Spalten haben, wenn Sie keine Spalten ausschließen, die in einigen Tabellen fehlen, wenn Sie die kombinierte Tabelle erstellen. (Sie müssen nicht verwenden like ..., können Sie die häufigere Liste der Spalten Syntax verwenden)

Verwandte Themen