2012-03-27 89 views
1

如下例所示,將三個或更多表連接在一起是否是一個好主意。我正在努力關注性能。有沒有什麼辦法可以重寫這個查詢,效率更高,執行速度更快?我試圖讓儘可能簡單化。非常感謝您的回答是否有加入3個或更多表的替代方案?

select * from a 
join b on a.id = b.id 
join c on a.id = c.id 
join d on c.id = d.id 
where a.property1 = 50 
    and b.property2 = 4 
    and c.property3 = 9 
    and d.property4 = 'square' 
+0

根據我的小知識,它看起來不錯只有.. – 2012-03-27 19:32:53

+0

性能您需要替換'*'只有你需要的列。 – 2012-03-27 19:45:21

回答

2

表現明智,我認爲這取決於每個表中的記錄數,並確保您已定義適當的索引。 (我也假設SELECT *是一個佔位符;你應該避免通配符)

我首先檢查你的執行計劃,並開始優化。如果你仍然沒有達到最佳性能,你可以嘗試使用臨時表來將4個表連接拆分成單獨的較小連接。

4

如果你想更快的性能,確保所有參加的都是由一個索引(羣集或非羣集)覆蓋。看起來這可以通過在上面的查詢中完成,通過在每個表上創建id和適當的屬性列上的索引

+0

投票贊成表現這個重要的一點,初學者像我一樣,曾經錯過.. :) – 2012-03-27 19:34:33

+0

我不熟悉如何做索引。你能解釋更多嗎?你能給個例子嗎? – dido 2012-03-27 19:56:02

+0

主鍵是聚集索引的一個示例。小心使用索引,因爲它們本質上是數據的副本,可以更快地檢索,但如果表中有大量數據,索引將佔用大量磁盤空間。這裏有一篇關於索引基礎的非常好的文章:http://www.simple-talk.com/sql/learn-sql-server/sql-server-index-basics/ – mattytommo 2012-03-27 20:00:26

2

假設規範化的數據庫,就結構化查詢而言,這是最好的,加入到位。

還有其他選項可供查看,包括在不同的join和select子句列中添加索引,對錶結構進行非規格化並縮小結果集。

在連接列(似乎是主鍵,因此可能已被編入索引)上添加索引將有助於提高連接性能,對select子句中的列編制索引將有助於加快每個表上的篩選。

如果你反規範化,你會得到一個重複數據的結構,其中包含重複數據的所有含義(主要是數據維護問題),但是當你不再需要連接時,你會獲得性能。

選擇列時,應指定您想要的列 - 使用*通常是一個壞主意。這樣您只能傳輸應用程序真正需要的數據。

4

如果您只選擇了列的一個子集,那麼在選擇所有3個表中的所有內容的時刻,您可以更快地完成這項工作。

+0

對,我可以選擇一個子集..但我擔心的是,這真的是一個好習慣嗎?或最佳實踐? – dido 2012-03-27 19:53:08

+0

那麼,如果你不需要全部3張桌子上的所有東西,這只是一個好習慣。舉個例子,你不需要10列,有100萬行,這是2000萬列數據,你沒有檢索,因此它會執行得更快:) – mattytommo 2012-03-27 19:58:16