2011-07-30 32 views
5

說我有這樣的查詢,在那裏我參加了一些虛擬表:虛擬表連接的效率如何?

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' 

在我真正的查詢,每個連接都有自己的連接,聚合函數和WHERE限制。

這樣的查詢運行得如何/很差?另外,這與將所有單個虛擬表作爲其自己的查詢並將結果鏈接到SQL以外的結果有什麼不同?

+0

你是說,反對真正的表連接?簡介它!它將取決於很多因素,其中很多因素將取決於您的數據/模式。而且,將結果鏈接到SQL之外很可能會慢很多。如果你看到巨大的性能問題,你可能需要在所有表中的索引超過x或foo –

+0

在我真正的查詢中,每個JOIN都有許多其他WHERE子句約束,附加連接和聚合函數,這就是爲什麼我將它們分開作爲虛擬桌面。也許有更好的方法去做呢? –

+0

如果每個子查詢都很複雜,那麼您真的應該對其進行配置。查看執行計劃並瞭解如何閱讀它們。 –

回答

5

使用內聯視圖(這是AFAIK是您稱之爲「虛擬表」的正確術語)沒有任何內在壞處。我建議學習查看和理解執行計劃,以便調查具體的性能問題。

一般來說,我認爲執行多個單表查詢並將結果基本上連接到前端代碼中是非常糟糕的主意。做連接是RDBMS的設計目的,爲什麼要重寫它?

3

爲什麼不乾脆:

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'; 

編輯:

,以及它如何會跑?誰知道?正如@Vinko所述,答案在於查看執行計劃,可能在適當的時候提供提示。看到一個人爲的例子無法回答這個複雜的問題。

+0

查看我上面的編輯 - 每個虛擬表JOIN都有自己的JOIN,集合函數和WHERE約束。 –