Мы разрабатываем сайты для риэлторских компаний. Веб-сайты используются только для отображения информации, и все веб-сайты используют общий шаблон. У нас около 150 веб-сайтов для разных клиентов. Некоторые сторонние поставщики данных ежечасно предоставляют нам все обновления о каждом объявлении на веб-сайте. Обновления для каждого клиента происходят в отдельные часы. В среднем у нас есть 1000 объявлений на каждый веб-сайт. И при каждом ежечасном обновлении изменяется или обновляется 80% данных.
Прямо сейчас у нас есть единая база данных на Sql server 2008 для всех клиентов (изначально предназначена для обслуживания 10-20 веб-сайтов). Таблицы в базе данных являются общими для всех. Проблема в том, что всякий раз, когда происходит обновление, оно также замедляет веб-сайты других клиентов, которые никак не связаны с обновлением. Также удаление данных о клиентах замедляет работу всех сайтов.
Я планирую переделать базу данных, создав отдельную схему для каждого клиента, но я не уверен, что это лучший способ решить нашу проблему. Наличие отдельной базы данных создает множество проблем для обслуживания (резервное копирование, зеркальное отображение и т. Д.). Может ли кто-нибудь предложить мне лучший способ решить эту проблему. Я не уверен, как это повлияет на производительность, если я создам отдельную схему для каждого клиента и изолирую их таблицы от других. Или есть лучшее решение?
Лично я предпочитаю несколько баз данных, так как это позволяет вам видеть, какие базы данных используют больше всего операций ввода-вывода и оперативной памяти, с различными DMV - и позволяет легко переносить самые большие базы данных в другое место. Кроме того, есть разделение безопасности, которое всегда успокаивает клиентов.
Брент Озар затронул именно эту проблему в недавнем сообщении в блоге - определенно стоит прочитать, поскольку он очень хорош: http://www.brentozar.com/archive/2011/06/how-design-multiclient-databases/
Хотя я, вероятно, рекомендовал бы использовать базу данных для каждого клиента, если вы хотите придерживаться одной базы данных, похоже, что схемы подойдут с учетом ваших требований.
Однако в дополнение к схеме для каждого клиента я бы рекомендовал вам также создать файловую группу для каждого клиента, а затем поместить все объекты базы данных для каждого клиента в эту файловую группу. У этого есть несколько преимуществ:
Я считаю, что максимальное количество файловых групп, которое у вас может быть, составляет 32000, поэтому эта стратегия должна длиться до тех пор, пока вам действительно не нужно будет думать о разделении на разные базы данных.
Для получения дополнительной информации я рекомендую книгу в Интернете, статья 'Файлы и архитектура файловых групп'и технический документ SQLCAT о частичной доступности базы данных: http://sqlcat.com/sqlcat/b/whitepapers/archive/2007/11/21/partial-database-availability.aspx
Если все клиенты используют одну и ту же базу данных, и все веб-сайты используют один и тот же шаблон, это больше похоже на многопользовательскую CMS, и поэтому наличие единой базы данных здесь действительно имеет смысл.
Я бы не стал рассматривать проблему в том, что обновления одного клиента влияют на всех остальных, а скорее в более низком уровне просто медленных обновлений и запросов в целом. Предполагая, что оборудование и нагрузка не изменяются, 150 баз данных, вероятно, будут работать так же, как решение для одной базы данных (возможно, медленнее при определенных обстоятельствах).
Я предполагаю, что ваша основная таблица - это таблица "списки", которая имеет примерно 150 * 1000 живых строк (предположительно + исторические записи).
Это не слишком большой объем данных, и машина с разумными характеристиками не должна иметь проблем.
Я бы позаботился о том, чтобы исторические записи перемещались в их собственные таблицы. В запросе на чтение я бы добавил "прочитать незафиксированный снимок"
В обновлениях есть несколько возможных исправлений для этого: 1. Используйте слияние, а не несколько операторов обновления 2. Используйте курсор, чтобы предотвратить эскуляцию блокировки 3. Добавьте новые записи для обновленных списков и просто обновите бит «является текущим» флаг на старых
Учитывая, что это было 2 года назад, каково было окончательное решение?
Похоже, вы больше озабочены тем, чтобы хранить все в одной базе данных любой ценой (хотя вы это подняли), поскольку основная идея Питера для разделения на отдельные базы данных была связана с производительностью и возможностью масштабирования в долгосрочной перспективе. В этом случае вам нужно либо разделить таблицы на разные схемы для клиентов, либо перейти на лицензию Enterprise Edition, чтобы вы могли использовать разделение таблиц и разделять общие таблицы на основе номера клиента.
Я задал себе тот же вопрос, когда планировал реструктурировать инфраструктуру базы данных. Эта статья мне очень помогла.
[https://msdn.microsoft.com/en-us/library/aa479086.aspx visible[1]