unclejosef (unclejosef) wrote,
unclejosef
unclejosef

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

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

Tags: it
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments