Фундаментальное понимание 3 или более таблиц SQL-соединений - PullRequest
0 голосов
/ 15 августа 2011

Прошу прощения за длинный вопрос заранее.Большинство онлайн-статей не обсуждают это, они просто показывают быстрый набор результатов.Для такой важной и часто используемой идеи я хочу полностью понять это.Я видел много постов здесь с конкретными примерами, но ни один не получил основную идею в головеМой вопрос: когда вы выполняете объединение таблиц 3+, как это работает в памяти?Оператор, который я сейчас использую:

select a.cust_id, a.[first name],a.[last name],a.[primary zip],c.jerseynum
from contact as a
join notes as b
on a.cust_id = b.cust_id
join jerseytable as c
on a.cust_id = c.cust_id 

, поэтому после первого соединения между a и b мы получим набор результатов, мы назовем его 1, затем я выполню соединение для a и c ..это было нечетко для меня.Этот набор результатов не просто заменяет мое предыдущее объединение, он только добавляет записи в 1, которые соответствуют только объединению между a и c?

Ответы [ 4 ]

3 голосов
/ 15 августа 2011

JOIN - это реляционный оператор: он принимает два отношения в качестве параметров, а результатом является другое отношение.

Реляционные операторы могут быть связаны друг с другом.Рассмотрим ваш запрос на реляционном языке. Учебное пособие D:

Предполагается, что x и y - соответственно объявленные переменные отношения (relvars):

x := a MATCHING b; 
y := x JOIN c {jerseynum};

В качестве альтернативы:

y := a JOIN c {jerseynum};
x := y MATCHING b; 

Однако вышесказанное навязывает оптимизатору порядок выполнения: назначение промежуточных результатов для relvars, по сути, говорит оптимизатору, как выполнять свою работу (то есть не очень хорошо).Их можно объединить, например, следующим образом:

a MATCHING b JOIN c {jerseynum};

Предложение SQL FROM работает аналогичным образом, т. Е. Нет необходимости присваивать промежуточным (производным) таблицам.Оптимизатор может оценивать их в любом порядке.Доверьтесь оптимизатору:)

3 голосов
/ 15 августа 2011

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

У механизма запросов есть много инструментов, в зависимости от объединений, индексов и другой статистики.держит.Он может создавать таблицы в памяти, изменять порядок соединений (в некоторых случаях), чтобы лучше ограничивать количество возвращаемых строк.Это может идентифицировать результаты различных объединений и объединить их вместе.

Для начала ознакомьтесь с планами запросов: http://en.wikipedia.org/wiki/Query_plan и соответствующим разделом по оптимизации запросов.

1 голос
/ 15 августа 2011

После анализа вашего запроса ядро ​​базы данных сгенерирует план , который описывает фактические шаги, которые необходимо предпринять для получения результатов запроса. Вы должны проверить свой реальный план, чтобы понять, что на самом деле происходит. По сути, оптимизатор будет выбирать порядок объединений независимо от того, как вы написали в sql. Фактический порядок объединений будет зависеть, помимо прочего, от индексов и статистики, хранящейся в данных. см. эту статью на оптимизаторе запросов http://research.microsoft.com/pubs/76059/pods98-tutorial.pdf

1 голос
/ 15 августа 2011

a соединяется с b, затем набор результатов объединяется с c. (Если вы используете MS SQL Server, вы можете увидеть этот процесс в плане выполнения запроса).

...