使用join优化SQL select查询

时间:2013-11-28 10:00:27

标签: mysql sql sql-server tsql

我有两张桌子:

 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

任何优化建议?

最好的问候。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

您实际上正在寻找内部联接。

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

这将提高CROSS-JOIN的性能,因为查找具有相同ProductNum的记录的条件隐含在JOIN条件中,并且WHERE子句被删除。

WHERE子句总是在加入后执行。在您的情况下,所有可能的组合都由CROSS JOIN创建,然后通过WHERE子句中的条件进行过滤。

通过使用INNER JOIN,您将在第一步中进行过滤。

答案 2 :(得分:1)

交叉连接速度较慢,因为它产生了所有组合,后者在谓词后面逐渐过滤。因此,您可以使用INNER JOIN来获得更好的性能。但我认为如果你检查这个查询的执行计划会很有用,因为在Oracle中,where和inner join解决方案之间没有区别Inner join vs Where

答案 3 :(得分:0)

尝试使用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 ..