воскресенье, 31 марта 2019 г.

IT заметки. ч. 5. Базы растут, время идет!

Недавно произошел поучительный случай, показывающий, что программы требуют внимания  и переписывания так как объем данных растет и появляются, а SQL серверы совершенствуются.
Базы данных по коммерческой недвижимости требуют выгрузки списков операторов, лендлордов и прочих ассоциированных с объектом компаний списком в одно поле. В других версиях SQL давно существовали функции типа LISTAGG(), но не в MS SQL.
Первый запрос, который я сделал 10 лет назад по классической тогда схеме через скалярную функцию. На базе в 1000 объектов это работало и получалось вполне интерактивно.
Второй запрос. Через четыре года назад я начал переписывать фронтэнд с MS Access на C# одной из баз (руководство предпочитало создавать базы на каждую продуктовую линейку), и консультанты захотели иметь при анализе список арендаторов. В той базе около 3500 объектов и запрос с функциями начал выполняться до минуты. К счастью это был не MS SQL 2000, а что-то современное (2008 R2) и там появилась конструкция FOR XML PARTH. Этот вариант сократил выполнение до 10 секунд.
Третий запрос. Год назад мне удалось убедить, руководство объединить базы. Запрос стал обрабатывать не 3500, а о 20000 записей. Запрос на XML начал работать 2,5 минуты. К счастью уже был не MS SQL R2, а 2017. В нем Microsoft сподобился и добавил STRING_AGG() для конкатенации строк внутри окна. И это помогло. Получилось 8 секунд!
Здесь эта функция сработала отлично, но на мой взгляд, функция не шибко удобна, не хватает возможности сделать DISTINCT внутри функции, приходится это делать через подзапросы и в некоторых случаях лучше использовать FOR XML PATH.

Комментариев нет:

Отправить комментарий