2014-09-11 2 views
0

Привет, мне интересно, улучшит ли производительность дополнительные условия в левом соединении. Пример кода ниже. Мне нужно знать данные о ценах для определенных предложений, но для этого вам понадобятся все данные. Просто интересно, стоит ли добавлять дополнительные условия соединения, чтобы ускорить работу?Left Join Performance с дополнительным фильтром левой таблицы

SELECT 
    * 
FROM 
    OFFERS 
LEFT JOIN PRICE ON (
    PRICE.PH_SUBS_LINK_SK = ACTSUBS.PH_SUBS_LINK_SK and 
    PRICE.PRICE_END_DT= '09-09-9999' and 
    OFFERS.PERCENT_VALUE >0 and 
    OFFERS.VALUE_OR_PERCENT = 'PERCENT' and 
    OFFERS.PRODUCT_OFFER_TYPE = 'RC' and 
    OFFERS.OFFER_STATUS_CODE in ('ACT','PTM') 
    ) 
+0

Это не условия соединения, а фильтры. Фильтрация данных дает лучшую производительность в целом, но зависит от индексов, разделов и т. Д. –

+0

Это будет зависеть от индексов размеров набора данных и других факторов, это не просто использование 'JOIN' vs' WHERE', которое повлияет на производительность. Во-первых, 'IN ('ACT', 'PTM')' часто может быть довольно неэффективным и часто быстрее, чем '(columnName = '' OR columnName = '')'. Вы также можете получить дополнительную помощь от http://dba.stackexchange.com/ как, хотя я считаю, что ваш вопрос также применим здесь, они могут иметь более глубокие знания по оптимизации :) – talegna

+0

Также зависит от того, какие СУБД вы используете. Вы сравнили планы выполнения? –

ответ

0

Я предлагаю, чтобы изменить код выше для этого:

SELECT 
    * 
FROM 
    OFFERS 
LEFT JOIN PRICE ON 
    PRICE.PH_SUBS_LINK_SK = ACTSUBS.PH_SUBS_LINK_SK 
WHERE PRICE.PRICE_END_DT= '09-09-9999' and 
    OFFERS.PERCENT_VALUE >0 and 
    OFFERS.VALUE_OR_PERCENT = 'PERCENT' and 
    OFFERS.PRODUCT_OFFER_TYPE = 'RC' and 
    OFFERS.OFFER_STATUS_CODE in ('ACT','PTM') 

Чтобы улучшить производительность создания индекса для полей, используемых на ИНЕКЕ.

+0

Это не эквивалентно исходному запросу из-за фильтра по внешней таблице, который теперь удалит все строки, где условие «PRICE_END_DT = '09 -09-9999'' не выполняется. Исходный запрос возвратит нулевые строки вместо несоответствующих цен. –