Извлечение большого количества данных занимает слишком много времени.Нужен способ ускорить его - PullRequest
0 голосов
/ 01 июля 2019

Я создаю веб-сайт клиентской панели, который отображает множество различных графиков и диаграмм различных представлений данных в нашей базе данных.

Данные относятся к записям медицинских пациентов и компаний, в которых они работают в страховых целях. Данные отображаются в виде сводных диаграмм, но на странице есть функция фильтрации, которую пользователь может использовать для фильтрации отдельных записей пациентов. Поля, по которым они могут фильтровать:

  • Даты медицинского иска
  • Отношение к страхователю
  • Пол
  • Группы работодателей (пользователь выбирает несколько различных групп, с которыми они работают, и может включать и выключать их в фильтре)
  • Списки пользователей (пользователь сайта может создавать произвольные списки пациентов, сохранять их идентификаторы и редактировать их позже). Можно выбрать ни один, ни один, ни несколько списков. Также имеется селектор any / all, если выбрано несколько.
  • Набор фильтров, которые пользователь может определить (с предустановленными значениями по умолчанию) из других, более внутренне структурированных фрагментов данных. Пользователь может настроить до трех из них и выбрать любой из них или ни одного из них, и они возвращают список идентификаторов пациентов, который хранится в памяти до тех пор, пока они не будут изменены.

Проблема в том, что загрузка данных может занимать много времени, некоторые страницы загружаются от 30 секунд до минуты (сначала загружается страница, а затем данные загружаются в виде JSON с помощью функции ajax, в то время как загрузка выполняется отображается). Некоторые из хранимых процедур, которые мы используем, очень сложны, требуют нескольких уровней вложенных запросов. Я пытался использовать Query Analyzer, чтобы упростить их, но мы внесли все рекомендуемые изменения, и это все еще занимает много времени. Сотрудники нашей базы данных смотрели и не видят другого способа упростить запросы, в то же время получая необходимые нам данные.

Способ, которым он настроен сейчас, только изменяет диапазон дат, и группы работодателей вызывают повторное попадание в базу данных. База данных никогда не фильтрует ни одно из других полей. Любые другие изменения в выборе фильтра делаются на переднем конце. Я попытался изменить способ работы и отправить все поля на сервер для фильтрации базы данных, и это заняло еще больше времени, не говоря уже о необходимости ждать каждого изменения вместо пары.

Мы используем MS SQL 2014 (SP1). Мой вопрос: каковы наши варианты ускорения? Даже если это означает полное изменение способа хранения наших данных?

1 Ответ

0 голосов
/ 01 июля 2019

Вы не предоставляете никаких подробностей - так что это довольно обобщенно.

Ускорьте ваши запросы - это лучший, самый простой и наименее подверженный ошибкам вариант.Современное аппаратное обеспечение может справляться с огромными наборами данных и при этом обеспечивать ответы в секунду.Опубликуйте ваши запросы, DDL, примеры данных и ОБЪЯСНЕНИЯ в переполнении стека - очень вероятно, что вы сможете добиться значительных улучшений.

Купите лучшее оборудование - если вы действительно не можете ускорить запросы,выяснить, что является узким местом, и купить лучшее оборудование.В наши дни это так дешево, что максимальное использование SSD, RAM и CPU, вероятно, будет стоить меньше, чем время, необходимое для выяснения того, как работать с менее оптимальными маршрутами ниже.

Кэширование -вместо того, чтобы возвращаться к базе данных для всего, используйте кеш.Выясните, насколько «современными» должны быть ваши информационные панели, насколько уникальны данные, и, если возможно, кешируйте результаты запросов.Многие среды разработки имеют первоклассную поддержку для кэширования.Проблема с кэшированием состоит в том, что это затрудняет отладку - если пользователь сообщает об ошибке, он смотрит на кэшированные данные?Если это так, является ли этот кэш устаревшим - это ошибка в данных или в кэшировании?

Предварительное вычисление Если кэширование невозможно, вы можете предварительно вычислить данные.Например, когда вы создаете новую запись о пациенте, вы можете обновить отчеты для «пациент по полу», «пациент по дате», «терпение от страховой компании» и т. Д. Это создает много работы и еще больше возможностей для ошибок,

Денормализация - это ядерный вариант.Денормализация обычно повышает скорость создания отчетов за счет скорости записи и за счет введения множества возможностей для ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...