Paul. Ваш вопрос состоит из двух частей.
Во-первых, почему запись идет медленно?
Когда вы говорите, что у вас большие базы данных, вы можете уточнить это некоторыми цифрами. Команды Microsoft продемонстрировали загрузку в несколько терабайт менее чем за час, но, конечно, они используют высокотехнологичное оборудование и специализированные методы хранения данных. Я принимал участие в командах хранилищ данных, которые регулярно загружали столько данных за одну ночь, что диски журналов транзакций должны были занимать более терабайта только для обработки быстрых пакетов, но не терабайта в час.
Чтобы выяснить, почему записи выполняются медленно, вам нужно сравнить методы загрузки с методами хранилища данных. Например, вы пробовали использовать промежуточные таблицы? Разделение таблицы? Данные и файлы журналов на разных массивах? Если вы не уверены, с чего начать, посмотрите мой учебник Perfmon, чтобы измерить вашу систему на предмет поиска узких мест:
http://www.brentozar.com/archive/2006/12/dba-101-using-perfmon-for-sql-performance-tuning/
Во-вторых, как вы масштабируете?
Вы спросили, как настроить несколько серверов баз данных, чтобы один из них обрабатывал массовую загрузку, в то время как другие обрабатывали операции чтения и некоторые записи. Я бы очень, очень предостерегал против использования подхода «несколько серверов для записи», потому что он быстро усложняется, но использование нескольких серверов для чтения не является редкостью.
Самый простой способ сделать это - доставка журналов: каждые X минут основной сервер создает резервную копию журнала транзакций, а затем эта резервная копия журнала применяется к серверу отчетов только для чтения. В этом есть некоторые уловки - данные немного отстают, и процесс восстановления должен удалить все соединения из базы данных, чтобы применить восстановление. Это может быть вполне приемлемым решением для таких вещей, как хранилища данных, где конечные пользователи хотят продолжать работать со своими собственными отчетами, пока загружаются данные нового дня. Вы можете просто не выполнять восстановление журнала транзакций во время загрузки хранилища данных, и пользователи могут поддерживать соединения все время.
Чтобы выяснить, какое решение подходит вам, добавьте к своему вопросу следующее:
- Размер вашей базы данных (ГБ / ТБ, # миллионов строк в самой большой таблице, в которой есть записи)
- Размер вашего сервера и хранилища (в коробке с 10 дисками есть другие решения, отличные от коробки, подключенной к SAN)
- Метод загрузки данных (это вставки с одной записью, массовая загрузка, разбиение таблиц и т. Д.)