Files
homework/dmedvedev/10.3.Optimization of select.sql
T
Dmitry Medvedev 297df348c1 fixed mistakes
2026-08-05 23:51:40 +05:00

59 lines
4.1 KiB
SQL
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Задача 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;
CREATE INDEX users_lower_country_idx ON users (LOWER(country));
SELECT id, name, age
FROM users
WHERE
created_at >= '2026-01-01' AND created_at < '2027-01-01'
AND LOWER(country) = 'россия'
AND age > 25;
Исправлено: Добавлен индекс, который приведет все строки данного столбца в нижний регистр и дальнейший поиск будет производиться только по индексу.