2013-11-28 56 views
1

我有兩個表:與優化SQL SELECT查詢加入

Shop_Products 
Shop_Products_Egenskaber_Overruling 

我想選擇Shop_Products_Egenskaber_Overruling所有記錄其在 Shop_Products相關記錄。這意味着具有相同ProductNum的記錄。

這適用於我以下的聲明,但我不認爲CROSS JOIN是大型記錄集的最佳方法。在Web控件中使用語句時,即使僅有1000條記錄,它也會變得非常慢。有沒有更好的方法來完成這一點?

SELECT  Shop_Products.*, Shop_Products_Egenskaber_Overruling.* 
FROM  Shop_Products CROSS JOIN 
      Shop_Products_Egenskaber_Overruling 
WHERE  Shop_Products.ProductNum = Shop_Products_Egenskaber_Overruling.ProductNum 

任何優化建議嗎?

此致敬禮。

回答

2

你實際上是在尋找一個INNER JOIN。

SELECT 
    SO.*, 
    SPEO.* 
FROM SHOP_PRODUCTS SP 
    INNER JOIN Shop_Products_Egenskaber_Overruling SPEO 
     ON SP.ProductNum = SPEO.ProductNum 

這將提高了性能在你的交叉聯接,因爲條件來尋找具有相同ProductNum記錄是在JOIN條件隱含和WHERE條款被消除。

WHERE子句總是在JOIN後執行。在你的情況下,所有可能的組合都由CROSS JOIN創建,然後通過WHERE子句中的條件進行過濾。

通過使用INNER JOIN您正在第一步中進行過濾。

+0

謝謝沒有區別!它真的提高了加載時間... – micknt

+0

@micknt不客氣。就像旁註一樣,CROSS JOIN應該始終是JOINS中的最後一個選項。 –

3

你可以這樣做的,但不知道它會確保優化

SELECT  Shop_Products.*, Shop_Products_Egenskaber_Overruling.* 
FROM  Shop_Products 
INNER JOIN Shop_Products_Egenskaber_Overruling on Shop_Products.ProductNum = Shop_Products_Egenskaber_Overruling.ProductNum 
+0

謝謝,內部連接是解決方案! – micknt

0

嘗試使用INNER JOIN

SELECT  Produkter.*, Egenskaber.* 
FROM  Shop_Products Produkter 
INNER JOIN Shop_Products_Egenskaber_Overruling Egenskaber ON Produkter.ProductNum=Egenskaber.ProductNum 

捷豹namngav艾文馬克PA Norska ..

+0

謝謝,內部連接是解決方案! – micknt

1

CROSS JOIN比較慢,因爲它會產生所有的組合,而這些組合是由where謂詞過濾的。所以你可以使用INNER JOIN來獲得更好的性能。但我認爲,如果你檢查此查詢的執行計劃,反正這將是有益的,因爲在甲骨文之間存在的位置和內部連接的工作解決方案和解釋方案Inner join vs Where

+0

謝謝,內部連接是解決方案! – micknt