Прочитавши 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 і т.д. ласка , чи не соромтеся відповідь / коментар в будь-якому випадку