簡體   English   中英

通過聯接優化SQL選擇查詢

[英]Optimize SQL select query with join

我有兩個表:

 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

有什么優化建議嗎?

最好的祝福。

您可以這樣做,但是不確定是否可以確保優化

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

您實際上是在尋找INNER JOIN。

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

這將比您的CROSS-JOIN有了更好的性能,因為在JOIN條件中隱含了查找具有相同ProductNum記錄的條件,並且消除了WHERE子句。

WHERE子句始終在JOIN之后執行。 對於您而言,所有可能的組合都是由CROSS JOIN創建的,然后由WHERE子句中的條件過濾。

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

交叉聯接的速度較慢,因為它會產生所有組合,然后按謂詞過濾。 因此,您可以使用INNER JOIN以獲得更好的性能。 但是我認為無論如何都要檢查該查詢的執行計划,這將很有用,因為在Oracle中,where和內部聯接解決方案之間的區別不大。

嘗試使用INNER JOIN

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

Jag namngav aven dem pa Norska ..

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM