2013-11-01 2 views
0

Я применяю объединения на более чем двух таблицах, а ниже - часть предложения where. Из следующих двух, которые лучше всего подходят для написания и почему?Какой запрос будет лучшим запросом?

where 
    d.bu_id  = 'ABC' 
and 
    hd.bu_id = 'ABC' 
and 
    s.bu_id  = 'ABC' 

ИЛИ

where 
    d.bu_id  = 'ABC' 
and 
    hd.bu_id = d.bu_id 
and 
    s.bu_id  = d.bu_id 
+0

Вы пробовали? Должно быть довольно легко проверить. – Andrew

+0

Уникально ли bu_id в каждой таблице? – igr

+0

Почему они не находятся в разделе 'ON'? – cmd

ответ

2

Лучшее решение действительно зависит от ваших ожидаемых моделей изменения. Если все три одинаковы, потому что они действительно относятся к одной и той же сущности, кажется более вероятным, что все они будут меняться вместе. В этом случае вы захотите пойти со вторым вариантом, чтобы не повторять себя.

Если они просто имеют одинаковое значение, более вероятно, что один из них изменится независимо в будущем, поэтому вы избавитесь от хлопот, сохранив его в первой форме.

Если вам интересно о производительности, нет большой разницы, так как любой оптимизатор запросов должен уметь отображать оба из них.

+0

Спасибо за ваш ответ. – user2946211

+1

Говоря хотя бы о DB2 for i, оптимизатору SQE все равно, существует ли предикат в предложении WHERE или в разделе JOIN ON. Он будет перемещать предикаты, где бы он ни решался, будет наиболее эффективным. – WarrenT

1

Я думаю, что лучшим решением будет объявить переменную для хранения bu_id вы ищете, то joinhd, s и d вместе bu_id. Это позволит вам изменить bu_id только в одном месте, если оно когда-либо понадобится. Добавление индекса в поля bu_id должно обеспечивать хорошую производительность.

DECLARE @bu_id CHAR(3) = 'ABC' 

SELECT 
    * 
FROM 
    table_d d 
    INNER JOIN table_hd hd on hd.bu_id = d.bu_id 
    INNER JOIN table_s s on s.bu_id = d.bu_id 
WHERE 
    d.bu_id = @bu_id 
+0

Спасибо за ваш ответ, у меня есть переменная, которая содержит bu_id, но я не упоминал об этом в вопросе. У меня есть другой вопрос после вашего ответа, что, если я не упоминаю предложение о внутреннем соединении, но просто упомянуть условие на таблицах, как указано выше? какая разница? – user2946211

+0

Я считаю, что @couchand верен, производительность между вашими примерами будет одинаковой. Кроме того, производительность между вашими примерами и моим примером также будет одинаковой. Оба способа приводят к внутреннему соединению. Использование синтаксиса «INNER JOIN» - это стандартная и внутренняя таблицы объединения ANSI-92 вместе в предложении 'WHERE' с знаком' = ', как и в вашем втором примере, является стандартом ANSI-89. – StyxUT

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