Разбиение на одну файловую группу

10

В моей базе данных есть несколько очень больших таблиц, но значительная часть этих данных «старая».

Из-за обстоятельств, не зависящих от меня, я не могу удалить эти «старые» данные. Другое ограничение заключается в том, что я не могу изменить базу данных, то есть добавить в нее файловые группы. Как сейчас обстоят дела, все находится в PRIMARYфайловой группе.

Я думал разбить эти таблицы на несколько разделов, таких как «новый», «старый», «заархивированный» и тому подобное. У меня есть столбец «статус», который я хотел бы использовать для этой цели.

Учитывая описанный сценарий и ограничения, мне было интересно, имеет ли смысл разделение здесь. Другими словами, если моя таблица разделена таким образом, но все разделы находятся в одной файловой группе, SQL Server будет достаточно умен, чтобы найти эту специальную область в базовом файле, где находятся мои «новые» данные, и не коснуться область со "старыми" данными?

Иными словами, если, скажем, 80% моих данных «старые». Есть ли в SQL Server механизм, позволяющий избежать доступа к 100% базовых файлов и доступа только к 20%, которые содержат «новые» данные (при условии, конечно, что в WHEREразделе запросов я указываю свой столбец разбиения ).

Я думаю, чтобы ответить на это, нужно было бы понять, как разделение реализовано внутри. Я ценю любые указатели.

Пол Уайт 9
источник

Ответы:

6

Есть два преимущества разделения таблицы в одной файловой группе:

  1. Позволяет постепенно восстанавливать части большого индекса, что обеспечивает более эффективное обслуживание. Просмотрите ALTER INDEX [foo] REBUILD PARTITION=nдля более подробной информации.
  2. Использование исключения разделов и (возможно) блокировки на уровне разделов для улучшения обслуживания запросов. Я обсуждаю это в своем блоге .

Есть несколько вещей, которые нужно иметь в виду, если вы создаете разделы.

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

Я рекомендую провести тщательное исследование по разделению, прежде чем приступить к его реализации. Кендра Литтл имеет отличный список ресурсов, с которых вы можете начать.

Майк Фал
источник
Если я разделил кластеризованный индекс, не все ли некластеризованные индексы уже содержат столбец разделения в качестве локатора строк?
Зикато
0

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

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

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

Гордон Линофф
источник
Интересно, сколько выиграет производительность при разметке на один и тот же физический диск?
Sotn