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

Откуда: Москва
Сообщений: 4804
Господа,
имеется крупная таблица заполненная данными. 100+ млн строк. У неё имеется первичный ключ. Схемы партиционирования у неё нет.

Есть желание ввести схему партиционировая по первичному ключу / кластерному индексу. Граница первой партиции будет задана так, что все существующие записи попададут в первую партицию. Деление существующих записей на партиции не должно возникнуть.

Реально ли накатить такую схему партиционирования на таблицу за короткое время? (Время того же порядка, что switch partition). Несколько секунд. На таблице в этот могут происходить вставки, но это атомарные операции размером в insert одной записи.

Кто-то делал такое и какие тут возможны варианты? Результатом должна быть таблица с тем же названием, теми же данными, но введенной схемой партиционирования. Будем считать, что внешних reference и schemabinding вьюх на эту таблицу не смотрит.
22 мар 17, 18:57    [20322542]     Ответить | Цитировать Сообщить модератору
 Re: Схема партиционирования на заполненной таблице  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Возможно только если у вас есть подходящий check-констрейнт, чтобы сервер без проверки поверил, что "первой партиции будет задана так, что все существующие записи попададут в первую партицию". В остальных случаях придется искать варианты, в зависимости от того, что для вас приоритетно: доступность таблицы или срок завершения всех манипуляций.

Сообщение было отредактировано: 22 мар 17, 19:51
22 мар 17, 19:51    [20322725]     Ответить | Цитировать Сообщить модератору
 Re: Схема партиционирования на заполненной таблице  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Гавриленко Сергей Алексеевич
Возможно только если у вас есть подходящий check-констрейнт, чтобы сервер без проверки поверил, что "первой партиции будет задана так, что все существующие записи попададут в первую партицию". В остальных случаях придется искать варианты, в зависимости от того, что для вас приоритетно: доступность таблицы или срок завершения всех манипуляций.


Как я сказал партиционирование по первичному ключу кластерному индексу. Уж констраинт так констрейнт. То есть identity нащелкало 150 000 000 , я делаю верхнюю границу первой партиции до 155 000 000 .
22 мар 17, 20:06    [20322758]     Ответить | Цитировать Сообщить модератору
 Re: Схема партиционирования на заполненной таблице  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Создать пустую секционированную таблицу.
В транзакции:
- заблокировать исходную таблицу
- переключить секцию из исходной в новую
- исходную удалить, новую переименовать.
22 мар 17, 20:40    [20322869]     Ответить | Цитировать Сообщить модератору
 Re: Схема партиционирования на заполненной таблице  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Блокировать исходную не обязательно.
22 мар 17, 20:46    [20322889]     Ответить | Цитировать Сообщить модератору
 Re: Схема партиционирования на заполненной таблице  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Еще раз. Для свитча непартиционированной таблицы в секцию партиционированной таблицы MSSQL попросит с вас соответствующий check constraint на первой таблице, чтобы удостовериться, что все данные в таблице точно не выходят за рамки секции. Все остальное из разряда "мамой клянус".

Сообщение было отредактировано: 22 мар 17, 21:15
22 мар 17, 21:15    [20322972]     Ответить | Цитировать Сообщить модератору
 Re: Схема партиционирования на заполненной таблице  [new]
o-o
Guest
a_voronin
Уж констраинт так констрейнт.

я думаю, его не остановит ни identity, ни наличие PK,
для чека поднимет все ваши 100+ млн строк,
хотя вроде бы достаточно макс. по индексу найти и убедиться, что он <= 155 000 000,
чтобы сообразить, что и все остальное не больше.
т.е. не верю во "Время того же порядка, что switch partition"
22 мар 17, 21:38    [20323028]     Ответить | Цитировать Сообщить модератору
 Re: Схема партиционирования на заполненной таблице  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33977
Блог
нет смысла секционировать по identity
22 мар 17, 22:10    [20323102]     Ответить | Цитировать Сообщить модератору
 Re: Схема партиционирования на заполненной таблице  [new]
o-o
Guest
Критик
нет смысла секционировать по identity

Почему это нету?
Накопил 200 Гб (лучше меньше, конечно) , отвесь секцию.
А то потом как время ребилда, так начинается:лог раздувает, места на диске нету, давайте вечный реорг делать.
23 мар 17, 00:08    [20323468]     Ответить | Цитировать Сообщить модератору
 Re: Схема партиционирования на заполненной таблице  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33977
Блог
o-o,

Потому что если секционировать, например, по дате, то это секционирование для некоторых запросов сыграет роль индекса, а место секционирование практически не занимает.
23 мар 17, 00:49    [20323563]     Ответить | Цитировать Сообщить модератору
 Re: Схема партиционирования на заполненной таблице  [new]
o-o
Guest
Критик
o-o,

Потому что если секционировать, например, по дате, то это секционирование для некоторых запросов сыграет роль индекса, а место секционирование практически не занимает.

Т. е. вы еще не видели его запросов, но они уже точно по дате?
23 мар 17, 07:41    [20323757]     Ответить | Цитировать Сообщить модератору
 Re: Схема партиционирования на заполненной таблице  [new]
o-o
Guest
... А заодно и уникальность id, которая была во всей таблице, превратится в уникальность внутри секции по дате, да?
23 мар 17, 07:49    [20323769]     Ответить | Цитировать Сообщить модератору
 Re: Схема партиционирования на заполненной таблице  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Критик
нет смысла секционировать по identity


Смысл как раз есть. Есть исторические логи, который выгружаются в OLAP базу. Они забираются инкрементально по identity. Админы исходной системы периодически хотят эти логи чистить.

Если сделать truncate, то теряется кусок данных между загрузками. Отсюда возникла идея, партиционировать логи и откалывать старые данные из них партициями, оставляя некоторую порцию недавно накопленного лога.
23 мар 17, 12:18    [20325058]     Ответить | Цитировать Сообщить модератору
 Re: Схема партиционирования на заполненной таблице  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
invm
Создать пустую секционированную таблицу.
В транзакции:
- заблокировать исходную таблицу
- переключить секцию из исходной в новую
- исходную удалить, новую переименовать.


Эта идея понятна, но в исходной таблице нет секционирования? Или они по умолчанию считается, что есть? Можно ли "всю таблицу" SWITCH-нуть в секцию другой таблицы?
23 мар 17, 12:20    [20325074]     Ответить | Цитировать Сообщить модератору
 Re: Схема партиционирования на заполненной таблице  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
o-o
... А заодно и уникальность id, которая была во всей таблице, превратится в уникальность внутри секции по дате, да?



Запросы 1) INSERT 1 запись 2) SELECT TOP XXX * WHERE ID BETWEEN ... ORDER BY ID

Вся возня с датами будет происходить уже на стороне OLAP
23 мар 17, 12:22    [20325084]     Ответить | Цитировать Сообщить модератору
 Re: Схема партиционирования на заполненной таблице  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Критик
o-o,

Потому что если секционировать, например, по дате, то это секционирование для некоторых запросов сыграет роль индекса, а место секционирование практически не занимает.


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

Исходная система -- обрабатывает заказ. Они не паряться на тему сколько раз какого числа какой заказ сменил сколько статусов. Эти занимаются в OLAP.
23 мар 17, 12:25    [20325091]     Ответить | Цитировать Сообщить модератору
 Re: Схема партиционирования на заполненной таблице  [new]
o-o
Guest
a_voronin
o-o
... А заодно и уникальность id, которая была во всей таблице, превратится в уникальность внутри секции по дате, да?



Запросы 1) INSERT 1 запись 2) SELECT TOP XXX * WHERE ID BETWEEN ... ORDER BY ID

Вся возня с датами будет происходить уже на стороне OLAP

мне-то зачем, это Критику показывайте.
он раз с датами работает, то и все по его мнению только с ними работают,
и то, что не делает он сам, "не имеет смысла"
23 мар 17, 12:39    [20325168]     Ответить | Цитировать Сообщить модератору
 Re: Схема партиционирования на заполненной таблице  [new]
o-o
Guest
a_voronin
invm
Создать пустую секционированную таблицу.
В транзакции:
- заблокировать исходную таблицу
- переключить секцию из исходной в новую
- исходную удалить, новую переименовать.


Эта идея понятна, но в исходной таблице нет секционирования? Или они по умолчанию считается, что есть? Можно ли "всю таблицу" SWITCH-нуть в секцию другой таблицы?

переключать можно и 2 непартиционированные таблицы,
но вам надо непартиционированную переключить в *секцию*,
и для этого на непартиционированной должен быть тот же самый констрэйнт как на секции,
Гавриленко уже 2 раза это повторил.
щас жирненько сделаю, чтоб трудно было не заметить
BOL
Nonpartitioned tables must have the same constraints as target partition.
If you are adding a nonpartitioned table as a partition to an already existing partitioned table,
there must be a constraint defined on the column of the source table that corresponds to the partition key of the target table.
This makes sure that the range of values fits within the boundary values of the target partition.

Transferring Data Efficiently by Using Partition Switching

и навесить check constraint на ваши 100+ млн строк это совсем не моментально и хорошо блокирующе
23 мар 17, 13:21    [20325457]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить