59 lines
4.0 KiB
SQL
59 lines
4.0 KiB
SQL
Задача 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.
|
||
|