Problem: Vergangenheitsinformationen und Zukunftsinformationen in getrennten Tabellen sollen in einer Ansicht zusammengefaßt werden, ohne persistierende Zwischenschicht und unter Beibehaltung der Indizierbarkeit. Tabelle A hält 6M Sätze, Tabelle B 100K. Beide Tabellen sind hot und deshalb würde eine persistierende Zwischentabelle eher schmerzen als nützen.
Ziel: Performanter, einheitlicher Live-Zugriff auf große Datenmengen mit nur einer Abfrage und ausschließen, dass jemand mit ineffizienten Abfragen den Server lahmlegt.
UNION
SELECT * FROM tblA
UNION
SELECT * FROM tblB
WHERE objectId=123;
- Ergibt keinen Sinn, da „UNION“ dazu führt, dass alles in einer eigenen Speicher-Sandbox landet, sprich die Indizes funktionieren nicht mehr. Der Datenbank bleibt nicht anderes übrig, als alle Sätze zu durchlaufen.
(SELECT * FROM tblA WHERE objectId=123)
UNION
(SELECT * FROM tblB WHERE objectId=123)
- OK, Indizes werden benutzt, aber wir wollen es ja live in einer View unterbringen, ohne dynamisch SQL-Queries zu schmieden.
JOIN
SELECT * FROM tblA JOIN tblB USING (objectid) WHERE objectId=123;
- Möglich, aber führt zu sperrigem Ergebnis, da die Infos auf mehreren Spalten verteilt liegen.