2013-05-01 2 views
1

я должен иметь некоторую SQL запросов каждый день, он обычно включает в себя присоединяется Я хотел бы знать, что является наиболее правильно способом сделать присоединиться к примеру в этом таблицахоптимизация SQL присоединиться

A("a",x,y) 
B("b",'a',z,w) 

где a и b являются первичными ключами,
, что лучше?

SELECT * 
FROM a,b 
WHERE a.a=b.a AND a.x<constant 

или

SELECT * 
FROM (SELECT * FROM a WHERE x < constant) t, b 
WHERE t.a=b.a 

Это означает, что лучше сделать первым, где положение и после того, как сделать присоединиться или я могу сделать присоединиться и после фильтра, где

спасибо!

+1

Оба запроса - это крест-соединение. Я бы сказал, что «лучше» зависит от того, какие данные вы используете, чего вы не совсем объясните. – Makoto

+1

проверить план выполнения запроса. Бьюсь об заклад, они обрабатываются одинаково –

ответ

2

Первый подход к вашему - лучший. Второй подход заключается в том, что имеет дополнительный запрос и наличие подзапроса в ваших запросах приведет к снижению производительности. Поскольку в вашем втором подходе запрос должен сначала получить все строки в таблице, а затем отфильтровать его на основе условия соединения, но в первом подходе запрос будет извлекать строки, которые соответствуют условию соединения, которое всегда выполняется быстрее. Надеюсь, что я сделал как можно проще ...!

+0

Я не согласен с тем, что было сделано предположение о размере данных (если данные относительно небольшие по размеру, то не должно быть заметного влияния на производительность), а также на вопрос спрашивается - если они идут за другими данными, тогда было бы более эффективно использовать другие типы объединений. – Makoto

+0

Да, я сделал предположение о размере данных. Я предположил, что данные в обеих таблицах большие, если не огромные. Но я чувствую, что даже если количество данных в тысячах, моя аналогия по-прежнему сохраняется. Поправьте меня, если я ошибаюсь. – Abhi

+0

@ Аби, ты совершенно прав. Соединение всегда быстрее. –

0

Интеллектуальный Оптимизатор (например, Oracle,) будет выполнять оба из них таким же образом:

Если результат SELECT * FROM a WHERE x < constant относительно мал:

Nested loop join

В противном случае:

Hash join

0

Начните с написания кода так же четко и ясно, насколько возможно e, для конкретной проблемы, а не микроуправление оптимизатором. На прошлой неделе, когда я использовал оба этих стиля запросов. Сколько-нибудь количество данных, которые вы тестируете сегодня, я могу гарантировать, что в следующем году вы будете работать в производстве с гораздо большим количеством данных.

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