diff --git a/dmedvedev/10.3.Optimization of select.sql b/dmedvedev/10.3.Optimization of select.sql new file mode 100644 index 0000000..4094305 --- /dev/null +++ b/dmedvedev/10.3.Optimization of select.sql @@ -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. +