Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Секционирование таблицы (текущие данные и данные старше месяца)  [new]
mism
Member

Откуда: Санкт-Петербург
Сообщений: 175
Есть задача.
Microsoft SQL Server 2016 (SP1) Enterprise Edition.
Есть таблица содержащая данные за последний год. При этом запросы идут к данным за последний месяц и очень редко ко всем данным за год. Есть желание секционировать таблицу по дате: оставить данные за последний месяц в одной секции и перенести ее в отдельную файловую группу и вынести ее на быстрый диск, оставшиеся данные за 11 месяцев перенести в другую секцию также вынести в другую файловую группу и перенести на медленный диск.
Жизнеспособна ли данная схема?
Как организовать перенос данных из текущих в исторические? Можно это делать раз в месяц-полмесяца, но как я понимаю ALTER PARTITION FUNCTION SPLIT, MERGE не вариант?
Или смотреть не в сторону секционирования?
3 май 17, 13:46    [20452971]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование таблицы (текущие данные и данные старше месяца)  [new]
aleks2
Guest
Если ваши желания желания совпадают с вашими возможностями - отчего бы и нет?

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

Только переносить лучше ежедневно. Ночью.
И понимать: перенос = копированию данных в другой файл.
3 май 17, 17:35    [20454095]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование таблицы (текущие данные и данные старше месяца)  [new]
mism
Member

Откуда: Санкт-Петербург
Сообщений: 175
aleks2,

А можно поподробнее - как было реализовано.
Как именно осуществлялся перенос из секции текущих данных в секцию исторических - выделялся новый диапазон из "текущих" данных и потом сливался с "историческими"?
Я несколько раз встречал упоминание, что SPLIT, MERGE на полной таблице крайне не рекомендуется.

Что значит "перенос = копированию данных в другой файл"?
3 май 17, 18:54    [20454313]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование таблицы (текущие данные и данные старше месяца)  [new]
s_ustinov
Member

Откуда: Munchen, DE
Сообщений: 2200
mism,
Я бы на вашем месте в качестве альтернативы также рассмотрел вариант с двумя таблицами - текщие данные + архивные данные. И вьюшка, которая объединяет эти две таблицы.
3 май 17, 19:25    [20454399]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование таблицы (текущие данные и данные старше месяца)  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4740
mism,

Партиционируйте по месяцам и перегоняйте через switch partition в другую таблицу
3 май 17, 19:48    [20454440]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование таблицы (текущие данные и данные старше месяца)  [new]
Mr. X
Guest
a_voronin,

Прямо вот так вот switch partition не получится потому, что: Есть желание секционировать таблицу по дате: оставить данные за последний месяц в одной секции и перенести ее в отдельную файловую группу и вынести ее на быстрый диск, оставшиеся данные за 11 месяцев перенести в другую секцию также вынести в другую файловую группу и перенести на медленный диск.

PS: я бы посмотрел в сторону запросов и индексов для них.
3 май 17, 21:43    [20454718]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование таблицы (текущие данные и данные старше месяца)  [new]
МуМу
Member

Откуда:
Сообщений: 1134
В вашем случае нельзя ни в коем случае подходить к вопросу по принципу - "При этом запросы идут к данным за последний месяц и очень редко ко всем данным за год".Получите статистику распределения(трассу включите и соберите). В некоторых случаях бывает можно даже на группы товара(популярные с большими запасами) бить и т.п. А в целом подход разбиения на две физические таблицы мне более импонирует. Далее можно и вьюхами объединять и на уровне запросов.
3 май 17, 22:06    [20454770]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование таблицы (текущие данные и данные старше месяца)  [new]
uaggster
Member

Откуда:
Сообщений: 827
mism
Есть задача.
Microsoft SQL Server 2016 (SP1) Enterprise Edition.
Есть таблица содержащая данные за последний год. При этом запросы идут к данным за последний месяц и очень редко ко всем данным за год. Есть желание секционировать таблицу по дате: оставить данные за последний месяц в одной секции и перенести ее в отдельную файловую группу и вынести ее на быстрый диск, оставшиеся данные за 11 месяцев перенести в другую секцию также вынести в другую файловую группу и перенести на медленный диск.
Жизнеспособна ли данная схема?
Как организовать перенос данных из текущих в исторические? Можно это делать раз в месяц-полмесяца, но как я понимаю ALTER PARTITION FUNCTION SPLIT, MERGE не вариант?
Или смотреть не в сторону секционирования?

А каков масштаб трагедии, т.с.?
Вообще, на вменяемом железе, все эти игры с секционированием начинают давать отдачу, когда основное хранилище уверено перевалило 100 млн. записей и бодро движется к миллиарду или более.
Во всех других случаях, ИМХО, не стоит это возни. Обычная плоская таблица, и всех делов.
Или вон, как s_ustinov сказал. Быстрая таблица с горячими данными Union All таблица с архивными данными.
У этого способа, кстати, есть одно большое преимущество - можно иметь различную структуру индексов на горячей и архивной таблицах, не мучаясь с фильтрованными индексами и т.п. + На архивной (= не изменяемой) таблице можно колоночный индекс построить (хотя для 2016 это не так актуально).
И обслуживание радикально упрощается! Раз в месяц перелил данные из горячей таблицы в архивную, индексы перестроил, статистику пересчитал, файловую группу забекапил - и спи отдыхай. Ни сплитов тебе, ни мерджей.

Ну, правда, если у вас не специфическая ситуация, типа возможности формирования хранилища параллельно кусками (напр., как данные разных филиалов), Или необходимости пересчета куска хранилища так, чтобы оно целиком всегда было в оперативной доступности.
Нет, оно конечно можно попытаться и быстродействие запросов так повышать... Гм...
Как там aleks2 говорит, в пчелайне так и делали.
Только была ли от этого польза и удовольствие?

WBR, как грицца.
3 май 17, 22:19    [20454804]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование таблицы (текущие данные и данные старше месяца)  [new]
МуМу
Member

Откуда:
Сообщений: 1134
А может вообще игра свеч не стоит... Короче трассу соберите, дюрейшены, ридсы посмотрите, другую статистику.
3 май 17, 22:22    [20454811]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование таблицы (текущие данные и данные старше месяца)  [new]
aleks2
Guest
mism
aleks2,

А можно поподробнее - как было реализовано.
Как именно осуществлялся перенос из секции текущих данных в секцию исторических - выделялся новый диапазон из "текущих" данных и потом сливался с "историческими"?
1. Я несколько раз встречал упоминание, что SPLIT, MERGE на полной таблице крайне не рекомендуется.

2. Что значит "перенос = копированию данных в другой файл"?


1. Ну ты могешь и воздушно-капельным путем переносить... А так-то окромя SPLIT, MERGE вариантов нету.

2. А как еще могут быть перенесены записи в ДРУГОЙ файл на ДРУГОМ диске?
4 май 17, 05:44    [20455129]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование таблицы (текущие данные и данные старше месяца)  [new]
mism
Member

Откуда: Санкт-Петербург
Сообщений: 175
aleks2,

Спасибо, понял технологию.
4 май 17, 09:49    [20455493]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить