Как улучшить производительность БД при одновременном подключении 1000 пользователей?
Есть Sql Server. На нем БД размером 500Гб. Все это работает на железном сервере с 100Гб ОЗУ и 2мя Xeonами.
БД используется веб-приложением. В моменты активной работы с приложением 1000 и более пользователей наблюдаются проблемы с отзывчивостью приложения. Профилировщик показывает на БД. В БД активно используется несколько таблиц, на которых постоянно висят блокировки. Таблицы размером по несколько десятков миллионов записей. В таблицы постоянно идут Insert и Update. С этих таблиц настроено чтение грязных данных (nolock), дабы избежать лишних блокировок.
Как можно оптимизировать работу с БД, чтобы избежать проблем с производительностью и блокировками?
в общем случае никак потому что на блокировки может быть завязана бизнес логика - как например у 1С.
в частном случае надо переходить на версионированные таблицы, они специально сделаны для разведения читателей и писателей. https://technet.microsoft.com/ru-ru/library/ms1750...
, используйте уровень изоляции READ COMMITED SNAPSHOT - проблема с локами уйдет, но сильно возрастёт нагрузка на tempdb, это решается переносом её на быстрый диск (на SSD хороший).
Вообще, звучит как сценарий для хорошего рефакторинга приложения и базы данных. Уменьшение зависимостей и др. Здесь можно было бы посмотреть в сторону CQRS, где возможны разные БД для комманд и для запросов.
База 500ГБ плохо, плохо когда она не помещается в ОЗУ. Может ее стоить разбить на несколько баз или почистить?
Я уверен, что 99% данных можно хранить в текстовом файле без БД.
Я не могу понять как грязные данные и блокировки сочетаются?