Сведения о вопросе

Solllo

06:02, 28th August, 2020

Теги

sql    

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

Просмотров: 472   Ответов: 8

Когда я соединяю три или более таблиц вместе общим столбцом, я бы написал свой запрос следующим образом:

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

действительно ли есть какие-то преимущества для этого? Конечно, оптимизатор может подразумевать это для себя?

edit: я знаю, что это злой синтаксис, но это быстрый и грязный пример законного унаследованного кода +1 @ Stu для его очистки



  Сведения об ответе

SILA

07:08, 14th August, 2020

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

В наши дни весь этот синтаксис все равно выходит наружу.


  Сведения об ответе

screen

02:50, 3rd August, 2020

Это грязный, злой синтаксис наследия. Вы пишете это как

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


  Сведения об ответе

lool

20:15, 22nd August, 2020

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


  Сведения об ответе

DINO

22:17, 25th August, 2020

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

а = б = c

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


  Сведения об ответе

nYU

22:23, 27th August, 2020

Я просто хочу сказать, что такого рода объединение-это дьявольская работа.
Просто подумайте об этом; условия для объединения и фильтрации смешиваются вместе в операторе where.
Что происходит, когда вам нужно объединить 20 таблиц и отфильтровать 15 значений?

Опять же, только мои $.Ноль два


  Сведения об ответе

piter

15:14, 18th August, 2020

В Microsoft SQL планы запросов для этих двух запросов идентичны - они выполняются одним и тем же способом.


  Сведения об ответе

lesha

08:20, 22nd August, 2020

Этот вопрос похож на этот здесь с очень глубоким объяснением:

SQL вопрос из статьи Джоэла Спольски

Короткий ответ заключается в том, что явное объявление свойства transitiv может ускорить выполнение запроса. Это связано с тем, что оптимизация запросов не является тривиальной задачей, и некоторые серверы SQL могут иметь проблемы с ней.


  Сведения об ответе

+-*/

09:36, 1st August, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться