Никогда не был настоящим базистом, но для интереса решил подготовиться и попробовать сдать
экзамен 70-461 (Querying MS SQL Server). Начал готовиться по
этим материалам и после изучения первых четырёх глав решил вернуться к очень старой задаче, о которой
писал ранее. На данный момент самые главные и переосмысленные знания, полученные из книги:
- Форматирование кода облегчает жизнь в разы.
- Использование CTE (common table expressions) позволяется, во-первых, избегать вложенных запросов, во-вторых, ссылаться на одни подзапросы из других.
- Очень важно понимать SARG (search arguments), иначе в ряде случаев наличие индексов не даёт производительности.
- Нельзя недооценивать EXPLAIN, ботлнеки искать в разы легче, чем пытаться самому догадаться.
- В правильных индексах - сила.
Хоть курс и относится к СУБД MS SQL Server, а старая задача на PostgreSQL, получить профит удалось.
Вот
старый запрос для получения топа посещаемых школами ресурсов. extract(year from std.day) здесь убивает SARG, и индекс по полю day никак не помогает.
Вот
свежий запрос, теперь функция от поля не берётся (std.day >= (SELECT "start" FROM params)). Время выполнения уменьшилось вдвое. Также вложенные запросы вынесены в CTE и код отформатирован, что делает запрос наглядным и понятным.
А вот
старый запрос получения статистической информации по трафику школ.
Обновлённый запрос. Не стоит обращать внимание на то, что время хранится в четырёх целочисленных полях y, m, d, h, это legacy. :3 Здесь удалось убрать ненужный UNION, заменив его аргументом GROUP BY, отказаться от группировки по полям s.rtcom_id, s.name, s.region, s.etap, s.finance, заменив её слиянием на более поздней стадии выполнения запроса. Скорость выполнения запроса возросла в 7 раз.
Использование встроенных временных функций позволило оба запроса (которые я каждый месяц обновлял, подставляя значения года и месяца предыдущего месяца) засунуть в соответствующие вьюшки и подключить их источниками данных для Excel, в котором строятся различные сводные таблицы для отчётов. В итоге на пару часов меньше ежемесячной рутинной работы.
Оригинал поста доступен
здесь