Имеет ли значение порядок соединения в SQL (MySQL specific) - не таблица в предложении FROM
Это не дубликат этого Q&A , потому что вопрос и ответы здесь касаются таблицы, упомянутой в предложении FROM. А моя-нет.
Предполагая, что таблица в предложении FROM всегда одна и та же, и я никогда ее не изменю. Имеет ли значение, в каком порядке я добавляю свои соединения?
Я использую встроенный конструктор запросов. (Да, я знаю, что там уже есть вещи, но это выходит за рамки вопроса).
Я хочу иметь возможность установите некоторые соединения в начале моего сценария, а некоторые позже на основе условных выражений, построитель запросов добавляет их в запрос сверху вниз. Будет ли механизм SQL оптимизировать порядок соединений в любом случае, независимо от их порядка в запросе?
Пример:
SELECT a.col1, d.col2, c.col1, b.col3
FROM table1 A
INNER JOIN table2 B
ON B.a_id = A.id
LEFT JOIN table3 C
ON C.id = A.c_id
LEFT JOIN table4 D
ON D.id = C.d_id;
SELECT a.col1, d.col2, c.col1, b.col3
FROM table1 A
LEFT JOIN table4 D
ON D.id = C.d_id
INNER JOIN table2 B
ON B.a_id = A.id
LEFT JOIN table3 C
ON C.id = A.c_id;
Здесь вы можете видеть, что я объявил соединение для table4 D, прежде чем соединение для его зависимой таблицы будет объявлено в скрипте (C). Разве это имеет значение?
1 ответ:
Простой ответ: Нет, вы не можете ссылаться на объект таблицы/псевдоним до объявления объекта.
MySQL выдаст ошибку на 2-м запросе. 'Unknown column' C. d_id ' in 'on clause'
Так что да... компилятор не смотрит вперед, чтобы увидеть, были ли ссылки на него позже.. Он только сначала знает порядок, а потом пытается выяснить, какой метод соединения лучше.
*чтобы решить вопрос: будет ли SQL-движок оптимизировать порядок присоединяется в любом случае, независимо от их порядка в запросе? *
Да, это оптимизирует порядок; но порядок " от " не может включать ссылку на таблицу до ее объявления, иначе запрос не будет компилироваться. (См. ошибку выше и ссылку, например)
Comments