2011-07-30 9 views
5

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?

+0

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 –

+0

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? –

+0

Jeśli każde podzapytanie jest złożone, naprawdę powinieneś go profilować. Zobacz plan wykonania i dowiedz się, jak je przeczytać. –

Odpowiedz

5

Nie ma nic złego w korzystaniu z widoków śródliniowych (co jest AFAIK właściwym terminem dla tak zwanych "wirtualnych tabel"). Polecam naukę przeglądania i zrozumienia planów wykonania, aby móc zbadać konkretne problemy z wydajnością.

Ogólnie rzecz biorąc, myślę, że to bardzo zły pomysł, aby wykonywać wiele zapytań pojedynczych tabel, a następnie w zasadzie dołączyć wyniki razem do kodu front-end. Robiąc połączenia, do czego jest przeznaczony RDBMS, po co go przepisujesz?

3

Dlaczego nie po prostu:

SELECT table1.a, tbl2.a, tbl3.b, tbl4.c, tbl5.a, tbl6.a 
FROM table1 JOIN table2 on table1.x = table2.x AND table2.foo = 'bar' 
      JOIN table3 on table1.x = table3.x AND table3.foo = 'bar' 
      JOIN table4 on table1.x = table4.x AND table4.foo = 'bar' 
      JOIN table5 on table1.x = table5.x AND table5.foo = 'bar' 
      JOIN table6 on table1.x = table6.x AND table6.foo = 'bar' 
WHERE anotherconstraint='value'; 

EDIT:

Jak dobrze byłoby go uruchomić? Kto wie? Jak stwierdza Vinko, odpowiedź polega na spojrzeniu na plan wykonania, być może dostarczając wskazówek w razie potrzeby. Coś, na co ten kompleks nie może odpowiedzieć, patrząc na wymyślony przykład.

+0

Zobacz moją edycję powyżej - każda wirtualna tabela JOIN ma własne JOINs, agregowane funkcje i ograniczenia WHERE. –

Powiązane problemy