2012-05-23 42 views
1

我有一個關於JOINS的問題。 Sql JOIN是否會降低查詢的性能? 我有許多JOIN查詢。我可以說,糟糕的表現是來自這些JOINS?如果是的話,我應該怎麼做而不是JOIN查詢?Sql JoiN和性能

這裏是我的一塊查詢

...... 
FROM (((((tb_Pinnummern INNER JOIN tb_Fahrzeug ON tb_Pinnummern.SG = tb_Fahrzeug.Motor_SG) INNER JOIN tb_bauteile ON tb_Pinnummern.Bauteil = tb_bauteile.ID) LEFT JOIN Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Plus ON Fehlercodes_akt_Liste_FC_Plus.ID=tb_bauteile.[FC_Plus]) LEFT JOIN Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Minus ON Fehlercodes_akt_Liste_FC_Minus.ID=tb_bauteile.[FC_Minus]) LEFT JOIN Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Unterbrechung ON Fehlercodes_akt_Liste_FC_Unterbrechung.ID=tb_bauteile.[FC_Unterbrechung]) LEFT JOIN Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Aderschl ON Fehlercodes_akt_Liste_FC_Aderschl.ID=tb_bauteile.[FC_Aderschl] 
WHERE (((tb_Fahrzeug.ID)=[forms]![frm_fahrzeug]![id])); 
+1

見:http://stackoverflow.com/questions/1200295/sql-join-vs-in-performance,只有這樣才能得到一個明確的答案爲您的特定測試是措施 –

+0

還...請更好地格式化您的查詢,水平滾動是不可能的 –

回答

1

顯然需要處理連接,並且此處理將消耗CPU,內存和IO。

除此之外,我們必須考慮,如果沒有正確的索引等,連接可能會真的非常糟糕。

但是,使用正確支持索引的SQL連接會產生比其他方法更快的結果。

只要考慮你需要做什麼來計算與上面的SQL相同的結果。讀取第一個表格,然後按照正確的順序排序,然後讀取第二個表格並對其進行排序,然後合併兩個結果集,然後繼續執行第三個表格...... 或讀取第一個表格中的所有行,並讀取爲每行發出SQL以檢索匹配的行。

-1

SQL連接完全不降低性能:恰恰相反:他們往往會成倍加快查詢,假設offcousre墊層數據庫模型很好的落實。索引在這件事上非常重要。

2

是的,它確實..增加表間記錄和聯接的數量會增加執行時間..左/右聯接絕對不會比INNER JOIN更快。 INDEXING在表的右列將提高查詢性能。

如果你的查詢有太多的連接並且它的執行頻率很高,你可以選擇創建SQL VIEW或Materialized VIEW(物化視圖 - 如果你使用的是Oracle)。

0

連接將絕對降低您將執行的SQL查詢的性能。 您應該爲您編寫的SQL生成SQL計劃,並查看降低SQL成本的方法。任何查詢分析工具都應該幫助你。

根據我在上面定義的查詢中理解的內容,您試圖從內聯接中的表中獲取所有行,並從左聯接中的表中獲取特定列(如果存在)。

既然如此,寫在下面給出格式的查詢應該有所幫助:

select (select Fehlercodes_akt_Liste_FC_Plus.column1 from Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Plus where Fehlercodes_akt_Liste_FC_Plus.ID=tb_bauteile.[FC_Plus]), 
    (select Fehlercodes_akt_Liste_FC_Minus.column2 from Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Minus where Fehlercodes_akt_Liste_FC_Minus.ID=tb_bauteile.[FC_Minus]), 
    (select Fehlercodes_akt_Liste_FC_Unterbrechung.column3 from Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Unterbrechung where Fehlercodes_akt_Liste_FC_Unterbrechung.ID=tb_bauteile.[FC_Unterbrechung]), 
    (select Fehlercodes_akt_Liste_FC_Aderschl.column4 from Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Aderschl where Fehlercodes_akt_Liste_FC_Aderschl.ID=tb_bauteile.[FC_Aderschl]), 
    <other columns> 
FROM 
(tb_Pinnummern INNER JOIN tb_Fahrzeug ON tb_Pinnummern.SG = tb_Fahrzeug.Motor_SG) 
INNER JOIN tb_bauteile ON tb_Pinnummern.Bauteil = tb_bauteile.ID) as <aliastablename> 

WHERE <aliastablename>.ID=[forms]![frm_fahrzeug]![id];