SQL

Никогда не был настоящим базистом, но для интереса решил подготовиться и попробовать сдать экзамен 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, в котором строятся различные сводные таблицы для отчётов. В итоге на пару часов меньше ежемесячной рутинной работы.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *