Каковы преимущества явного соединения с транзитивным закрытием в SQL? - PullRequest
4 голосов
/ 14 августа 2008

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

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 для его очистки

Ответы [ 8 ]

4 голосов
/ 14 августа 2008

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

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
4 голосов
/ 14 августа 2008

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

В наши дни весь синтаксис в любом случае исчезает.

2 голосов
/ 14 августа 2008

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

1 голос
/ 14 августа 2008

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

1 голос
/ 14 августа 2008

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

Опять же, только мои $ .02

1 голос
/ 14 августа 2008

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

a = b = c

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

0 голосов
/ 06 февраля 2009

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

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

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

0 голосов
/ 14 августа 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...