Общее
Это статья из цикла “Укорение работы баз данных под управлением СУБД MS SQL“. Сегодня мы рассмотрим файловые группы базы данных.
Зачем нужны файловые группы SQL
Оставлять большую базу данных в виде двух сегенерированных по умолчанию файлов – наихудшая практика. Оставить базу в таком положении можно лишь для разработки и очень небольших баз. В остальных случаях следует разбить базу данных по группам и файлам. Ниже мы рассмотрим разбиение базы данных по файловым группам. Итак, файловые группы нужны нам для:
- обеспечения работы секционирования (partitioning) больших таблиц
- для ускорения работы базы путем разнесения таблиц с существенно различными характеристиками доступа по разным файлам и дискам
- для поддержки многопроцессорных платформ
- отделения индексов от таблиц и вынесения колонок типа BLOB в отдельные файлы (группы)
- обеспечения работы базы в условиях нехватки дискового пространства
- для организации раздельных backup’ов.
Рассмотрим каждое из применений. Обеспечение секционирования базы таблицы (индекса). Довольно часто встречается ситуация, когда нужно хранить данные в одной большой таблице. Всякие там истории транзакций, архивы операций, журналы и прочее. И нет никакой возможности куда-либо это слить из базы. Со временем такая таблица разрастается, занимает много места на томе, все больше и больше времени уходит на поиск в ней и ее дефрагментацию. Поэтому все нормальные СУБД (с версии 2005 – и MS SQL, наконец-то) предлагают таблицы секционировать, разбить на разделы – partitions, по какому-либо признаку, скажем, по месяцам. Каждый фрагмент такой таблицы будет помещен в свой файл (группу файлов). СУБД в случае секционированной таблицы не тратит время, чтобы лопатить весь файл базы, а ориентируется по индексу и читает\пишет данные сразу в/из нужного файла. Таким образом мы экономим на времени и, что немаловажно, на блокировках. Кроме того, каждую файловую группу можно забэекапить отдельно.
Разнесение разных таблиц по файловым группам. Нетривиальная база содержит десятки, если не сотни таблиц. Доступ к этим данным совершенно отчетливо разный – одни используются редко, вторые – часто. В одни больше пишем, вторые читаем. Скажем, редко используемые справочники мы поместим в отдельную файловую группу и переведем на медленный диск. А оперативные данные – на самый быстрый. Архив – тоже на медленный, но на большой. С целом быстродействие системы, время ее отклика повыситься, так как разные по характеру запросы перестанут отнимать друг у друга диск (файл, группу файлов). Бессмысленно смотреть в профайлер, пытаясь понять, почему запросы тормозят. Нужно посмотреть в другое место (анализ базы и счетчики- в отдельной статье).
Поддержка многопроцессорных систем. В то время как однопроцессорная система только делает вид, что умеет выполнять несколько процессов одновременно, многопроцессорные системы реально выполняют задачи в параллель. В том числе – и задачи записи и чтения данных на диск. Можно позволить SQL – серверу использовать несколько процессоров для одновременной записи данных на диск, создав в базе несколько , так сказать, “беговых дорожек”. Гипертрединг лучше отключить, все равно SQL не понимает, что это такое. Следует поэкспериментровать с этим. У меня получались наилучшие результаты при числе файлов, равном удвоенному числу процессоров, без учета гипертрединга (гипертредный процесссор считается за единицу).
Отделение индексов и блобов. Тут то же соображение, что и во втором пункте – индекса и сами данные суть различающиеся по активности единицы. БЛОБы вообще храняться в базе отдельно. Посему в активно используемой базе индекса сдедует хранить отдельно, особенно учитывая возможность их отключения (потенцальную возможность), а также необходимость их регулярного перестроения. Лучше перестроить один маленький файлик, чем базу на 2000 Гигабайт, а? Кластерные индексы не в счет, они все равно представляют в конечном счете сами данные. Так что с кластерными не получиться. БЛОБЫ вообще отдельный вопрос. Если две таблицы имеют два блобовых поля, храните эти блобы по разным группам.
Нехватка дискового пространства. Тут все просто. Представим, что мы слегка просчитались, и база вот-вот заполнит диск. Места там уже нет, том не расширяемый. Что делать? Добавить в базу файл на другом диске, лучше – отдельной группой.
Резервное копирование групп. Тоже все просто: база содержит справочные данные, которые вообще никогда не меняются, но которых внушительное число, и оперативный журнал, который маленький, но критичный к потере, а также огромного размера архив, который в принципе уже по большей части заархивирован. Неразумно тратить дисковое \ ленточное пространство на резервное копирование тех же самых данных каждый раз по-новой. Лучше копировать только оперативные, справочники – вообще один раз, а архив – инкрементально. (Про хардваре для базы – следующий раз.)