2013-11-28 3 views
1

У меня есть две таблицы:Оптимизировать SQL запрос на выборку с присоединиться

Shop_Products 
Shop_Products_Egenskaber_Overruling 

Я хочу, чтобы выбрать все записи в Shop_Products_Egenskaber_Overruling, который имеет связанный запись в Shop_Products. Это означает запись с равным ProductNum.

Это работает для меня с приведенным ниже утверждением, но я не думаю, что CROSS JOIN - лучший подход для больших наборов записей. При использовании инструкции в веб-элементах управления она становится довольно медленной, даже с 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 статьи всегда выполняются ПОСЛЕ СОЕДИНЕНИЯ. В вашем случае все возможные комбинации создаются 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 

Jag namngav Авен дем ра Norská ..

+0

Спасибо, внутреннее соединение было решением! – micknt

1

Крест присоединиться медленнее, потому что он производит все комбинации, которые фильтруются после того, где предикат. Таким образом, вы можете использовать INNER JOIN для лучшей производительности. Но я думаю, было бы полезно, если вы все равно проверите план выполнения этого запроса, потому что в Oracle нет никакой разницы между решениями для размещения и внутреннего соединения. Inner join vs Where

+0

Спасибо, внутреннее соединение было решением! – micknt

Смежные вопросы