Позволит ли создание отдельных баз данных в SQL Server повысить производительность? - PullRequest
1 голос
/ 09 июня 2011

Все, я по профессии программист, но для этого конкретного проекта я тоже считаю себя администратором. Вот сценарий, с которым я столкнулся:

Веб-приложение с 400-1000 клиентов. Клиент - это «физическая компания», в каждой из которых есть n пользователей. Каждый клиент (компания) имеет в среднем 1 ГБ данных (всего около 200 миллионов строк). Каждая компания имеет, вероятно, 80% похожих данных с точки зрения типа хранимых данных. Остальные 20% - это пользовательские данные, которые сами компании могут определить (в основном пользовательские поля).

Я пытаюсь найти лучший способ масштабировать это по дешевке, если учесть, что клиентам нужно довольно хорошее время реакции. Например, клиент X может захотеть получить все записи, где фамилия, например, «кузнец», и телефон, например, «555», где клиент Y может захотеть получить все записи, где номер счета равен «1526A».

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

Мой вопрос: что бы вы сделали? Как вы думаете, было бы разумно разделить каждого клиента на свою собственную БД? Общий размер БД на данный момент составляет около 400 ГБ.

Это полное переписывание, так что мне повезло, что я могу начать все заново, если это необходимо. Любые мысли, подсказки будут с благодарностью.

Ответы [ 4 ]

5 голосов
/ 09 июня 2011

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

В итоге вы уступаете производительность своей БД прихоти своих клиентов.Если они могут «создать свой собственный запрос», то они могут «создавать свои собственные РЕАЛЬНО ПЛОХИЕ запросы».

Итак, если вы запускаете это в общей среде (то есть на том же оборудовании)то ужасное сканирование таблиц клиента А может насытить ввод-вывод для всех остальных.

Если они находятся на одном и том же сервере базы данных, то сканирование клиента А позволяет сбросить данные всех ваших клиентов из кэша данных..

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

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

Если вы не знаете, «что индексировать», тогда вы не предлагаете большой контрольнад тем, что могут делать клиенты, и, следовательно, фактор глупости возрастает.

Вы, вероятно, довольно далеко продвинетесь, предложив несколько популярных готовых представлений SQL, из которых клиенты могут выбирать, а затем они 'ограничены простой фильтрацией и, возможно, упорядочением результатов.Затем вы оптимизируете выполнение этих представлений.

Вероятно, что удивительно мало "общих" представлений могут охватывать большое количество вариантов использования.

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

0 голосов
/ 09 июня 2011

Если у вас есть отдельные базы данных, то 80%, то есть то же самое, становится практически невозможным для того, чтобы оставаться неизменным во времени.В итоге вы потратите гораздо больше денег на обслуживание.

К счастью, у SQL Server есть несколько вариантов для вас.Сначала поместите информацию о клиенте sspeicifc в ту же базу данных в отдельную схему, а общие элементы - в другую схему (создайте общую схему и схему для каждого клиента).

Затем настройте разделение данных клиентом.Это может потребовать соответствующего оборудования, чтобы сделать это эффективно.

Теперь у вас есть одна базовая кодовая база, которая будет сообщать об изменениях всем клиентам одновременно, и клиенты будут разделены для производительности с помощью разделов.

0 голосов
/ 09 июня 2011

Создание отдельных баз данных на одном сервере не поможет вам повысить производительность.Оптимизация производительности, доступная вам для нескольких баз данных, такая же, как вы можете добиться для одной базы данных.

Отдельные базы данных могут иметь смысл по административным причинам - если разные требования к резервному копированию или доступности применяются, например, к разным клиентам.

Вероятно, все-таки целесообразно создать приложение, чтобы оно могло поддерживать несколько баз данных, чтобы у вас была возможность масштабирования по нескольким серверам БД.

0 голосов
/ 09 июня 2011

Вопрос SO Как спроектировать мультитенантную базу данных содержит ссылку на достойную статью о компромиссах по спектру от «ничего не поделено» до «все делилось».Кроме того, у SO есть тег для таких вопросов;Я добавил это для вас.

...