Страницы

Поиск по вопросам

суббота, 1 февраля 2020 г.

Объединение таблиц: Join(ы) или обычным способом?

#sql #postgresql


Читаю про Join(ы) и вижу такие примеры: 
Вот пример без Join(a)

SELECT prod_name, vend_name, prod_price, quantity FROM OrderItems, Products, Vendors
WHERE Products.vend_id = Vendors.vend_id
AND OrderItems.prod_id = Products.prod_id
AND order_num = 20007;


А вот пример с ним: 

SELECT vend_name, prod_name, prod_price 
FROM Vendors INNER JOIN Products
ON Vendors.vend_id = Products.vend_id;


Хотел спросить в чем отличие? Что первый что второй запрос выдают один и тот же результат.
Помню на лекциях говорили, что: Чем меньше кода тем лучше. В данном случае вижу что
с INNER JOIN кода меньше поэтому он лучше? Есть ли различия по производительности?
Почему все JOIN(ы) используют, а не первый пример допустим?
    


Ответы

Ответ 1



SQL - это декларативный язык. Вы просто говорите, что вы хотите получить, а СУБД уже сама решает, как ваши данные достать. Оба запроса описывают один и тот же результат. Помню на лекциях говорили, что: Чем меньше кода тем лучше. Это спорно. В моем окружении программисты придерживаются мнения, что код должен быть максимально понятным. Отсюда, краткость - не всегда хорошо. В данном случае вижу что с INNER JOIN кода меньше поэтому он лучше? Я склонен считать, что inner join лучше, т.к. с ним запрос более понятен. Это становится особенно актуально, когда в запросе таблиц 5 и больше. Есть ли различия по производительности? Часто движок СУБД изменяет запросы, по этому правильно сравнивать производительность запросов не по их тексту, а по плану запроса.

Ответ 2



from table1, table2 Это полный эквивалент для from table1 cross join table2 Из-за дополнительных условий в where может быть похож на inner join, но в первую очередь это декартово произведение множеств (Cartesian product). По стилю написания - это вопрос холивара и стандартов кодирования на проекте. Здесь не может быть однозначного ответа. В то же время синтаксис from table1, table2 - это только декартово произведение, тогда как синтаксис join даёт больше возможностей. Например, left join через декартово произведение не сделать. По производительности - планировщик СУБД в любом случае перепишет запрос так как ему больше понравится опираясь на свою статистику значений и модель cost-based оптимизатора. У postgresql вообще нет какого-то абстрактного оператора объединения таблиц. Потому что даже такую простую штуку как inner join для двух таблиц postgresql может выполнить минимум 6 разными способами: используя алгоритмы nested loops, hash или merge join и для прямого и для обратного порядка объединения таблиц. Затем помножить число возможных планов выполнения на возможности параллельного выполнения. Затем помножить на возможности выполнения по индексам (3 разных способа) или последовательным чтением всей таблицы. И на вопрос производительности запроса может ответить только конкретный explain (analyze,buffers)

Ответ 3



Оператор JOIN проще и понятнее, чем WHERE с кучей условий. Плюс JOIN, как правило, выполняется быстрее. Но, для того чтобы точно сказать о производительности нужно смотреть план выполнения конкретного запроса в конкретной СУБД.

Комментариев нет:

Отправить комментарий