added optimization of select
This commit is contained in:
@@ -0,0 +1,58 @@
|
|||||||
|
Задача 1 — Одинаковые ли запросы?
|
||||||
|
Напиши, будут ли эти два запроса давать одинаковый результат? Объясни почему.
|
||||||
|
Результат будет одинаковый потому что фильтрация по одинаковым параметрам, однако время выполнения запроса разное (фактическое), возможно потому что БД дольше работает с числами, нежели чем с текстом (я имею ввиду внутри фильтрации).
|
||||||
|
Но мне кажется, раз в современных СУБД есть оптимизатор, то он сам должен оптимально выбрать порядок и в таком случае разницы в выполнении мы не должны видеть.
|
||||||
|
|
||||||
|
|
||||||
|
Задача 2 — JOIN в разном порядке
|
||||||
|
Будут ли результаты одинаковыми?
|
||||||
|
будут одинаковые
|
||||||
|
|
||||||
|
Какой таблицей оптимизатор начнёт чаще всего? Почему?
|
||||||
|
Начнет с меньшей, где можно отфильтровать данные быстрее.
|
||||||
|
|
||||||
|
Задача 3 — Первое знакомство с EXPLAIN
|
||||||
|
Какой тип сканирования использует база (Seq Scan, Index Scan)?
|
||||||
|
Seq Scan
|
||||||
|
Сколько строк она прочитала?
|
||||||
|
Прочитано 10 строк, 9 удалено по условию
|
||||||
|
Сколько времени это заняло?
|
||||||
|
0.067сек
|
||||||
|
|
||||||
|
Задача 4 — Сравни два плана
|
||||||
|
Почему второй запрос может быть быстрее первого?
|
||||||
|
Потому что в запросе на вывод участвуют не все колонки.
|
||||||
|
|
||||||
|
Задача 5 — JOIN с EXPLAIN
|
||||||
|
С какой таблицы начала читать база? Почему именно с неё?
|
||||||
|
Начала читать с users потому что есть условие where где отфильтровываются некоторые строки и поэтому БД понимает что выгоднеее начать с users, тк таблица меньше.
|
||||||
|
|
||||||
|
Задача 6 — Найди узкое место
|
||||||
|
❓ Найди как минимум 2 проблемы, которые замедляют запрос. Как их исправить?
|
||||||
|
Первая проблема это использование функций внутри WHERE, здесь функция LOWER, вторая - LIKE с %, когда невозможно использовать индекс, а третья - группировка по name, что может в конечном счете исказить данные.
|
||||||
|
|
||||||
|
Задача 7 — Оптимизируй JOIN
|
||||||
|
В каком порядке база будет читать таблицы? Почему? Можно ли как-то ускорить этот запрос?
|
||||||
|
Сначала читается users как самая маленькая после фильтрации, потом orders, order_items и products
|
||||||
|
|
||||||
|
Задача 8 — Сравни подходы
|
||||||
|
Запусти оба с EXPLAIN ANALYZE и сравни время выполнения.
|
||||||
|
Первый будет работать быстрее потому что выводит меньше колонк, соответственно ест меньше памяти.
|
||||||
|
|
||||||
|
Задача 9 — Найди и исправь
|
||||||
|
SELECT *
|
||||||
|
FROM users
|
||||||
|
WHERE EXTRACT(YEAR FROM created_at) = 2026
|
||||||
|
AND LOWER(country) = 'россия'
|
||||||
|
AND age + 10 > 35;
|
||||||
|
|
||||||
|
|
||||||
|
SELECT id, name, age
|
||||||
|
FROM users
|
||||||
|
WHERE
|
||||||
|
created_at >= '2024-01-01' AND created_at < '2025-01-01'
|
||||||
|
AND country = 'RU'
|
||||||
|
AND age > 25;
|
||||||
|
|
||||||
|
Исправлено: выдача колонок "все" заменено на "определенные", логика в where с числами переработана, соответствие определенному году переработано и убрал функцию LOWER.
|
||||||
|
|
||||||
Reference in New Issue
Block a user