Каковы преимущества явного транзитивного закрытия соединения в SQL?

StackOverflow https://stackoverflow.com/questions/11028

  •  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-серверов могут возникнуть проблемы с ней.

Однако этот синтаксис имеет свое применение...бывают случаи, когда вы обнаруживаете, что вам нужно объединить две таблицы более чем в одном поле

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top