2013-11-28 58 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