Горизонтальное разделение таблицы фактов в SQL Server 2005

ОГЛАВЛЕНИЕ

Таблицы фактов имеют тенденцию разрастаться до очень большого размера, причем очень быстро. Иногда таблица данных оказывается настолько большой, что ею трудно управлять, и на запросы SQL может неблагоприятно воздействовать размер вовлеченной совокупности данных. Однако, чтобы упростить работу с таблицей, можно горизонтально разделить ее на секции.

Горизонтально разделенная на секции таблица - это таблица,  в которой наборы строк разделены на непересекающиеся секции. Каждая секция в горизонтально разделенной таблице определена по диапазону значений, таких как время, географическая область или фамилии клиента. Можно предусмотреть хранение каждой секции на различных жестких дисках для увеличения производительности запроса. Хотя горизонтально разделить таблицу на секции нетрудно, потребуется некоторое техническое проектирование, потому что в данном случае администратор имеет дело с большим количеством данных. Давайте исследуем, когда и почему нужно горизонтально делить таблицу фактов на секции, и как создать функцию разделения таблицы, используя  встроенные функциональные возможности SQL Server 2005.

Почему таблицу фактов разделяют на секции?

Большими таблицами (таблицами с сотнями миллионов строк) может быть трудно управлять. В транзакционной базе данных ассоциативные таблицы (то есть те таблицы, которые используют отношение «многие-ко-многим») часто имеют наибольшее количество строк. В моделировании размерностей таблица фактов - эквивалент ассоциативной таблицы. Подобно ассоциативной таблице в транзакционной базе данных,  в таблице фактов чаще бывает намного больше строк, чем связанных размерностей, возможно, по количеству столько же, сколько строк получается в результате произведения (числа строк в размерности 1) x (число строк в размерности 2) x (# число строк в размерности n).

Разделим эти громадные таблицы на управляемые части. Если временные окна для обслуживания базы данных сжимаются, или количество обрабатываемых данных растет, можно разделить таблицу на секции и выполнять задачи, такие как резервное копирование и восстановление, по секциям или разделам. Или при контроле непротиворечивости базы данных (DBCC) для того чтобы обновить статистику таблицы по секциям вместо статистики по полной таблице. SQL Server 2005 интерпретирует многие секции разделенной таблицы как единый логический объект, и многочисленные секции для пользователей выглядят как единая таблица.

Для горизонтального  разделения таблиц существует несколько причин:

  • управлять проще, когда каждая секция размещена в отдельном хранилище и увеличение числа операций чтения/ записи способствует быстрому выполнению запроса;
  • удобнее резервировать и восстанавливать секционные данные, индексы могут быть перестроены и реорганизованы по секциям. А сами индексы могут быть разделены по секциям;
  • можно использовать прямые запросы, которые включают условие WHERE, содержащее поле разбиения или индексное поле в соответствующем разделе;
  • можно уменьшить диапазон блокировок и непроизводственные издержки менеджера блокировок, потому что блокировка ограничена разделом;
  • можно без труда объединять или разбивать на разделы, если разделение проходит по одной и той же группе файлов.

Какие таблицы являются лучшими кандидатами на горизонтальное разделение? Очень большие таблицы, таблицы, которые станут очень большими в ближайшее время и таблицы, которые могут быть разделены интуитивно, основываясь на их назначении (например, по финансовым годам). Эти таблицы должны включать столбцы, которые не имеют значений NOT NULL, и это поле можно использовать для разделения строк на дискретные без пересечений разделы, вроде столбца с датой продаж.

Если в базе данных есть большая таблица фактов, по которой выполняются запросы и не выполняются операции модификации, давайте проверим, как разделение на секции может затронуть производительность выполнения запросов в конкретном окружении. SQL Server 2005 работает с разделами, и при медленном выполнении запросов можно включить условие WHERE, которое содержит разделяющее на секции поле или индексированное поле (и индекс также разделен). При запросе выбирается исключительно нужная для его исполнения секция. Эта функция может значительно помочь производительности.