Каковы преимущества явного транзитивного закрытия соединения в SQL?
-
08-06-2019 - |
Вопрос
Когда я объединяю три или более таблиц с помощью общего столбца, я пишу свой запрос следующим образом:
SELECT *
FROM a, b, c
WHERE a.id = b.id
AND b.id = c.id
коллега недавно спросил меня, почему я не сделал явного Присоединиться к транзитивному замыканию в моих запросах вроде этого:
SELECT *
FROM a, b, c
WHERE a.id = b.id
AND b.id = c.id
AND c.id = a.id
действительно ли в этом есть какие-то преимущества?Неужели оптимизатор может подразумевать это для себя?
редактировать:Я знаю, что это злой синтаксис, но это быстрый и грязный пример законного устаревшего кода +1 @Стю за очистку
Решение
Вам не нужно делать это в современных СУБД, но было время, когда подобные вещи давали оптимизатору запросов больше подсказок относительно возможных путей индекса и, следовательно, более быстрых результатов.
В наши дни весь этот синтаксис все равно исчезает.
Другие советы
Это грязный, злой устаревший синтаксис.Вы пишете это как
Select * -- Oh, and don't ever use *, either From A Inner Join B On A.ID = B.ID Inner Join C On B.ID = C.ID
Нет, этот синтаксис возник еще в те времена, когда в языке еще не было объединений.Не уверен в проблемах, связанных с этим, но определенно существуют языковые конструкции, которые больше поддерживаются для объединения таблиц.
Я просто хочу сказать, что такого рода объединение — дело дьявола.
Просто подумай об этом;условия объединения и фильтрации смешиваются в оператореwhere.
Что произойдет, если вам нужно объединить 20 таблиц и отфильтровать 15 значений?
Опять же, только мои 0,02 доллара.
В Microsoft SQL планы выполнения этих двух запросов идентичны — они выполняются одинаково.
Если вы посмотрите на это с математической точки зрения, ваши примеры должны дать те же результаты.
а = б = с
Таким образом, ваш первый пример даст те же результаты, что и второй, поэтому не нужно выполнять дополнительную работу.
Этот вопрос похож на этот здесь с очень подробным объяснением:
Вопрос SQL из статьи Джоэла Спольски
Короткий ответ: явное объявление свойства транзитив может ускорить запрос.Это связано с тем, что оптимизация запросов — нетривиальная задача, и у некоторых SQL-серверов могут возникнуть проблемы с ней.
Однако этот синтаксис имеет свое применение...бывают случаи, когда вы обнаруживаете, что вам нужно объединить две таблицы более чем в одном поле