⚠️ У SQL порядок обробки запиту відрізняється від того, як ми його пишемо!
У SQL ми пишемо запити в такому порядку;
SELECT
c.customer_id
, c.customer_name
, COUNT(o.order_id) AS total_orders
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
WHERE
o.order_date > '2024-01-01'
GROUP BY
c.customer_id, c.customer_name
HAVING
COUNT(o.order_id) > 5
ORDER BY
total_orders DESC;
Тобто порядок написання коду такий:
SELECT — FROM — JOIN — WHERE — GROUP BY — HAVING — ORDER BY
Але насправді при обробці запиту порядок виконання цих операторів інший. Під час обробки запиту оператори виконуються в такому порядку:
FROM — JOIN — WHERE — GROUP BY — HAVING — SELECT — ORDER BY
😵💫 АЛЕ ЧОМУ?
Це насправді пов’язано з англійською мовою…
Уявімо, що гурман-американець прийшов до ресторану гамбургерів і хоче зробити замовлення. Його замовлення, ймовірно, виглядатиме так:
"Я хочу гамбургер, з меню, але тільки якщо він має сир. Групуйте замовлення за типом м’яса, покажіть мені лише ті, де більше 10 замовлень, і відсортуйте за популярністю."
Так, це трохи деталізоване замовлення, але гурман є гурман! 😉
Тепер давайте зіставимо це з SQL;
Я хочу гамбургер (SELECT),
з меню (FROM),
але тільки якщо він має сир (WHERE).
Групуйте замовлення за типом м’яса (GROUP BY),
покажіть мені тільки ті, що мають більше 10 замовлень (HAVING),
і відсортуйте їх за популярністю (ORDER BY).
Тепер все зрозуміло… SQL був спроектований так, щоб його синтаксис був схожий на звичайну мову, тому порядок написання коду не збігається з порядком виконання операцій.
ЩО РОБИТИ З ЦІЄЮ ІНФОРМАЦІЄЮ?
👉 Коли ви хочете оптимізувати свої SQL-запити, слід орієнтуватися на порядок виконання операцій, а не на порядок їх написання.
👉 Тому оптимізація на перших етапах обробки запиту буде набагато ефективнішою, ніж покращення на пізніших етапах.
👉 Наприклад, оптимізація в умовах WHERE матиме більший ефект, ніж оптимізація в SELECT.
— — — — — — — — — — — — — — — — — — —
⭐ ПРИКЛАД
Припустимо, у нас є така таблиця:
SELECT
c.customer_name,
COUNT(o.order_id) AS order_count
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
WHERE
o.order_date > '2024-01-01'
GROUP BY
c.customer_name;
ORDER BY
COUNT(o.order_id)
Якщо ми хочемо покращити цей запит, наприклад, додавши умову до WHERE, як от customer_status = 'active'
, це значно зменшить кількість записів, з якими працюватиме база даних. Це також суттєво покращить продуктивність на етапах GROUP BY або ORDER BY.
Отже, SQL має різний порядок написання та виконання операцій. Порядок написання коду схожий на звичайну англійську мову, а порядок виконання операцій орієнтований на оптимізацію роботи запиту.
Сподіваюся, це було корисно…
Salih Hocaoğlu.
SQL #SQLOptimizasyonu #SQLSorguları #MSSQL #MSSQLServer
Перекладено з: SQL’de sorgu işleme sırası kodu yazdığımız şeklinden farklıdır!