После прочтения запроса Slow SQL, не уверенного в том, как его оптимизировать , я подумал об общей производительности запросов. Конечно, нам нужно, чтобы результаты первой таблицы (при объединении других таблиц) были как можно меньшими до объединения (внутренние объединения для этого вопроса), чтобы сделать наши запросы немного быстрее.
Пример, если это:
SELECT *
FROM ( SELECT * FROM table1 WHERE col = @val ) t
INNER JOIN table2 ON col = col2
Быть лучше / быстрее чем:
SELECT *
FROM table1
INNER JOIN table2 ON col = col2
WHERE table1.col = @val
Моя теория заключается в следующем (это может быть неправильной реализацией, я пытаюсь вспомнить из внутренней книги SQL Server 2008, которую я прочитал (MSFT Press)):
- Обработчик запросов сначала получает левую таблицу (table1)
- Присоединяется ко второй таблице (table2) и формирует декартово произведение, прежде чем отфильтровать необходимые строки (если применимо)
- Затем выполняется предложение WHERE, ORDER BY, GROUP BY, HAVING с последним оператором SEELCT.
Так что, если в приведенном выше утверждении № 1 таблица меньше, движку SQL нужно меньше работать при формировании декартовых произведений. Затем, когда вы достигнете оператора where, у вас будет сокращенный набор результатов для фильтрации в памяти.
Я мог быть так далеко от цели, это нереально. Как я уже сказал, это теория.
Твои мысли?
Примечание : я только что подумал об этом вопросе, и у меня еще не было шансов выполнить какие-либо тесты.
Примечание 2 : Меченый , как SQL Server , так как я не знаю ничего об осуществлении MySql и т.д. Пожалуйста , не стесняйтесь ответ / комментарий в любом случае
источник