Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Автоматическое секционирование таблиц MSSQL 2012

#sql #sql_server


есть две таблицы 


  tab1 
  
  | id | time |
  
  tab2
  
  | id | id_tab1 | value |


Нужно секционировать обе таблицы, в первой таблице диапазоном будет time, а во второй
таблице диапазоном будет  id_tab1, начальное и конечно значение в секции таблицы tab1.id

один из вариантов который мне пришел на ум:


создать секции для tab1 на 10 лет в перед. с 2013-01-01 до 2020-01-01. 
создать событие которое будет запускаться раз в месяц. Будет производится выборка
первого и последнего значения секции прошедшего периода и для tab2 будет разбиваться
последняя секция, отсекая прошедший месяц. 


разделение секции происходит по алгоритму:


скинуть функцию (DROP PARTITION FUNCTION muFun).
создание вновь данной функции.
применение функции с указанием дополнительного диапазона разделения(ALTER PARTITION
FUNCTION myFun() SPLIT RANGE (500))


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


Ответы

Ответ 1



Вам не нужно сбрасывать функцию, чтобы добавить новый период. Просто добавляете командой ALTER PARTITION FUNCTION [имя функции]() SPLIT RANGE (GETDATE()) У нас такая команда выполняется в джобе раз в сутки, в этом же джобе последняя партиция переносится во временную таблицу: ALTER TABLE [таблица] SWITCH PARTITION $PARTITION.[имя функции](граница для переноса) TO [временная таблица] После чего временная таблица транкейтится TRUNCATE TABLE [временная таблица] А в основной таблице последняя перенесенная партиция сливается с предыдущей: ALTER PARTITION FUNCTION [имя функции]() MERGE RANGE (граница для переноса) Это самый быстрый способ избавления от лишних данных в партиционированных таблицах - собственно для этого во многом партиционирование и было сделано. В SQL Server 2016 работа с партициями еще упростилась - вы можете транкейтить сразу отдельные партиции, не перенося их во временные таблицы.

Комментариев нет:

Отправить комментарий