Убили индекс одной функцией: почему YEAR(date) тормозит базу Ты… — SQL Academy: всё о реляционных БД и SQL — TG.ME

🪓 Убили индекс одной функцией: почему YEAR(date) тормозит базу

Ты создал идеальный индекс по дате, но запрос всё равно работает целую вечность. Причина кроется всего в одной функции.

⚙️ Почему база игнорирует индекс
🔹 Как только ты пишешь WHERE YEAR(order_date) = 2023, база перестаёт видеть исходные значения дат.
🔹 Она не может искать по индексу (как по алфавитному указателю в книге), потому что ей нужно сначала вычислить год для каждой строки таблицы.
🔹 Итог — долгое полное сканирование (Seq Scan), даже если нужных строк всего пара штук.

🚀 Как починить (правило SARG)
Чтобы индекс сработал, колонка должна оставаться «чистой» — без математики и функций. Перенеси все условия в правую часть от знака равенства.

🔸 Плохо: индекс сломается
SELECT * FROM orders 
WHERE YEAR(order_date) = 2023;


🔸 Хорошо: моментальный поиск
SELECT * FROM orders 
WHERE order_date >= '2023-01-01' AND order_date < '2024-01-01';


💡 Оставляй проиндексированную колонку в одиночестве слева от условия, и база ответит моментально.
❤7👍5🔥3
August 31, 2026 1.1K 1 6