SQL-разделение/объединение разделов таблицы:Какой подход лучше всего реализовать?

StackOverflow https://stackoverflow.com/questions/160128

  •  03-07-2019
  •  | 
  •  

Вопрос

Microsoft в своем MSDN вход об изменении разделов SQL 2005 перечислил несколько возможных подходов:

  • Создайте новую секционированную таблицу с нужной функцией секционирования, а затем вставьте данные из старой таблицы в новую таблицу с помощью инструкции INSERT INTO...SELECT FROM.
  • Создание секционированного кластерного индекса в куче
  • Удалите и перестройте существующий секционированный индекс с помощью инструкции Transact-SQL CREATE INDEX с предложением DROP EXISTING = ON.
  • Выполните последовательность операторов ALTER PARTITION FUNCTION.

Есть идеи, какой будет наиболее эффективный способ для крупномасштабной БД (миллионы записей) с разделами на основе дат записей (что-то вроде ежемесячных разделов), где данные распространяются на 1-2 года?

Кроме того, если я в основном получаю доступ (для чтения) к недавней информации, будет ли смысл хранить раздел за последние X дней, а все остальные данные будут в другом разделе?Или лучше разделить и остальные данные (для любого произвольного доступа по диапазону дат)?

Это было полезно?

Решение

Я бы порекомендовал первый подход — создание новой секционированной таблицы и вставку в нее — потому что он дает вам возможность сравнивать старые и новые таблицы.Вы можете протестировать планы запросов для обоих стилей таблиц и посмотреть, действительно ли ваши запросы выполняются быстрее, прежде чем переходить к новому дизайну таблиц.Вы можете обнаружить, что улучшений нет, или вам может потребоваться попробовать несколько различных функций/схем секционирования, прежде чем остановиться на конечном результате.Возможно, вы захотите разделить данные по чему-то другому, кроме диапазона дат — дата не всегда эффективна.

Я выполнил секционирование таблиц по 300–500 млн строк с данными, распределенными за 6–7 лет, и этот подход с вставкой таблицы оказался наиболее полезным.

Вы спросили о том, как разбить на разделы. Лучшим ответом будет попытка спроектировать разделы так, чтобы ваши запросы попадали в один раздел.Если вы склонны концентрировать запросы на последних данных, И если вы фильтруете это поле даты в предложенияхwhere, тогда да, создайте отдельный раздел для самых последних X дней.

Имейте в виду, что вам необходимо указать секционированное поле в предложенииwhere.Если вы не укажете это поле, то запрос, вероятно, будет обращаться к каждому разделу для получения данных, и в этот момент у вас не будет никакого прироста производительности.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top