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