Say mam zapytanie jak to, gdzie mogę dołączyć szereg wirtualnych stołach:Jak nieefektywne są wirtualne połączenia tablicowe?
SELECT table1.a, tbl2.a, tbl3.b, tbl4.c, tbl5.a, tbl6.a
FROM table1
JOIN (SELECT x, a, b, c FROM table2 WHERE foo='bar') tbl2 ON table1.x = tbl2.x
JOIN (SELECT x, a, b, c FROM table3 WHERE foo='bar') tbl3 ON table1.x = tbl3.x
JOIN (SELECT x, a, b, c FROM table4 WHERE foo='bar') tbl4 ON table1.x = tbl2.x
JOIN (SELECT x, a, b, c FROM table5 WHERE foo='bar') tbl5 ON table1.x = tbl5.x
JOIN (SELECT x, a, b, c FROM table6 WHERE foo='bar') tbl6 ON table1.x = tbl6.x
WHERE anotherconstraint='value'
W moim prawdziwym zapytania, każdy ma swój własny JOIN JOIN, funkcje agregujące, a gdzie ograniczenia.
Jak dobrze/źle byłoby takie zapytanie? Jaka jest różnica w oddziaływaniu między nimi i uruchamianie wszystkich poszczególnych tabel wirtualnych jako własnych zapytań i łączenie wyników razem poza SQL?
Masz na myśli, przeciwieństwie do prawdziwych JOIN tabeli? Profiluj to! Będzie to zależeć od wielu czynników, a wiele z nich będzie zależało od twoich danych/schematu. Łączenie wyników poza SQL będzie prawdopodobnie znacznie wolniejsze. Jeśli widzisz duże problemy z wydajnością, możesz potrzebować indeksu ponad x lub foo we wszystkich tabelach –
W moim prawdziwym zapytaniu, każdy z JOINów ma wiele innych ograniczeń klauzuli WHERE, dodatkowych sprzężeń i funkcji agregujących, i dlatego je oddzieliłem jako wirtualne tabele. Być może jest lepszy sposób na zrobienie tego? –
Jeśli każde podzapytanie jest złożone, naprawdę powinieneś go profilować. Zobacz plan wykonania i dowiedz się, jak je przeczytać. –