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

krutoi

21:06, 1st October, 2020

Теги

sql    

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

Просмотров: 389   Ответов: 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 для его очистки



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

dump

21:06, 1st October, 2020

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

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


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

VERSUION

02:34, 28th 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


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

repe

21:58, 6th August, 2020

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


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

COOL

05:19, 20th August, 2020

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

а = б = c

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


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

Chhiki

07:22, 14th August, 2020

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

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


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

SKY

03:42, 25th August, 2020

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


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

#hash

18:21, 3rd August, 2020

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

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

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


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

darknet

22:11, 19th August, 2020

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


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

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