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

Откуда: Kiev
Сообщений: 62
Коллеги, запутался.

Первоначально было определено секционирование следующим образом

ALTER DATABASE CDWH ADD FILEGROUP [FG2008];
GO
ALTER DATABASE CDWH ADD FILEGROUP [FG2009];
GO
ALTER DATABASE CDWH ADD FILEGROUP [FG2010];
GO


CREATE PARTITION FUNCTION pf_byDate(Date)
	AS RANGE RIGHT
	FOR VALUES('2009-01-01','2010-01-01','2011-01-01')

CREATE PARTITION SCHEME ps_byDate
AS PArtition pf_byDate
TO ([FG2008],[FG2009],[FG2010],[PRIMARY])
GO

Т.е. текущие данные после '2011-01-01' хранились в файловой группе [PRIMARY]

Сейчас хочу создать новую файловую группу для 2011 года, а данные с начала 2012 хранить в [PRIMARY]...

Как сделать так, чтобы данные из [PRIMARY] за 2011 год переместить в новую файловую группу [FG2011] ?

Спасибо!
10 янв 12, 18:38    [11880903]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование : как поменять местами секции  [new]
mike909
Member

Откуда:
Сообщений: 662
Panf,

Хи-хи
Нужно было создавать так:
CREATE PARTITION FUNCTION pf_byDate(Date)
	AS RANGE RIGHT
	FOR VALUES('2008-01-01','2009-01-01','2010-01-01','2011-01-01')

CREATE PARTITION SCHEME ps_byDate
AS PArtition pf_byDate
TO ([PRIMARY],[FG2008],[FG2009],[FG2010],[FG2011])

Но, не все потеряно
1) Перекинте секции в простые таблицы.
2) Убейте старую секционированную таблицу, схему, функцию.
3) Создайте все в обратной последовательности (как в приведенном скрипте)
4) Переключите простые таблицы из файловых групп [FG2008],[FG2009],[FG2010] в соответствующие секции.
5) Перекинте простую таблицу из группы [primary] в группу [FG2011] и переключите в соответствующую секцию.
Это если очень кратко ...
10 янв 12, 19:37    [11881174]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование : как поменять местами секции  [new]
Panf
Member

Откуда: Kiev
Сообщений: 62
mike909,
Спасибо.

Но разве при такой схеме
CREATE PARTITION FUNCTION pf_byDate(Date)
	AS RANGE RIGHT
	FOR VALUES('2008-01-01','2009-01-01','2010-01-01','2011-01-01')

CREATE PARTITION SCHEME ps_byDate
AS PArtition pf_byDate
TO ([PRIMARY],[FG2008],[FG2009],[FG2010],[FG2011])

не будет следующей ситуации : данные за 2008 будут хранятся в [PRIMARY]?

Видимо не совсем четко задал вопрос. Данные существуют и до 2008 года...
Все что до 2009 -> FG2008,
c 2009 по 2010 -> FG2009,
с 2010 по 2011 -> FG2010,
с 2011 по 2012 -> FG2011,
2012 -> [PRIMARY]
11 янв 12, 12:11    [11883852]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование : как поменять местами секции  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
хмм.. вопрос: а что вы будете делать в январе 2013 года?

такую же перестройку?
11 янв 12, 12:17    [11883902]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование : как поменять местами секции  [new]
edyaN
Member

Откуда: Berlin
Сообщений: 185
Panf
mike909,
Спасибо.

Но разве при такой схеме
CREATE PARTITION FUNCTION pf_byDate(Date)
	AS RANGE RIGHT
	FOR VALUES('2008-01-01','2009-01-01','2010-01-01','2011-01-01')

CREATE PARTITION SCHEME ps_byDate
AS PArtition pf_byDate
TO ([PRIMARY],[FG2008],[FG2009],[FG2010],[FG2011])

не будет следующей ситуации : данные за 2008 будут хранятся в [PRIMARY]?

да, будут
если вам надо хранить данные до 2008 года и данные 2008 года в FG2008, то вам нужна левая функция, и тогда последняя точка должна быть в будущем, а все что после нее идет в primary:
CREATE PARTITION FUNCTION pf_byDate(Date)
	AS RANGE LEFT
	FOR VALUES('20081231 23:59:59.997'
                  ,'20091231 23:59:59.997'
                  ,'20101231 23:59:59.997'
                  ,'20111231 23:59:59.997'
                  ,'20121231 23:59:59.997'
                )

CREATE PARTITION SCHEME ps_byDate
AS PArtition pf_byDate
TO ([FG2008],[FG2009],[FG2010],[FG2011],[FG2012],[PRIMARY])


Таким образом Primary будет пустой (и это правильно).
Не надо хранить данные пусть даже и актуальные в Primary, чтобы в дальнейшем избежать перемещения данных.
11 янв 12, 12:42    [11884118]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование : как поменять местами секции  [new]
mike909
Member

Откуда:
Сообщений: 662
Panf,

Если у Вас есть данные до 2009 г. и Вы страстно желаете их поместить в одну файловую группу, то что Вам мешает (кроме религии)
обозвать эту файловую группу не [FG2008], а [FG_0000_2008].
А схему создать так
CREATE PARTITION SCHEME ps_byDate
AS PArtition pf_byDate
TO ([FG_0000_2008],[FG_0000_2008],[FG2009],[FG2010],[FG2011])

?

To edyaN,

Еще немного и Вы дойдете до моей идеи использовать границу в далеком будущем в качестве хранения сущностей имеющих вермя жизни.
Во, загнул зато кратко.
А если по подробнее, то
Довольно часто бывает, что некоторая сущность (например тариф) характеризуется временем начала действия и временем окончания,
которое, как правило, заранее не известно.
В такой ситуации практически все загоняют в качестве времени окончания - NULL.
А затем борятся 90 % всех запросов к БД с этим NULL_ом примерно так:
where [DateEND] is NULL

пытаясь выбрать "актуальные" данные на "сегодня". Знакомо ?

Теперь представим RIGHT ф-ию секционирования по "времени окончания"
CREATE PARTITION FUNCTION pf_byDate(Date) --> [DateEND]
	AS RANGE RIGHT
	FOR VALUES('2009-01-01','2010-01-01','2011-01-01','9999-01-01')

CREATE PARTITION SCHEME ps_byDate
AS PArtition pf_byDate
TO ([FG_0000_2008],[FG_0000_2008],[FG2009],[FG2010],[FG2011],[FG9999])


И, как и раньше, когда нужно добавить следующий год (в данном примере) мы просто создаем следующую группу [FG2012] и добавляем новую границу '20120101-01-01'.
Данная операция пройдет так же быстро, т.к. "актуальные" данные ([DateEND = '9999-01-01']) будут лежать в FG9999 (ф-я RIGHT),
а новая граница будет пилить диапазон '2011-01-01' - '9999-01-01', НО данных в диапазоне '20120101-01-01' - '9999-01-01' НЕТ !!!.
Естественно если границу добавлять не задним числом.
Более того,
Все запросы с "[DateEND] IS NULL" можно переделать в
declare @f int
SELECT @f = [fanout] 
FROM sys.partition_functions WHERE name = 'pf_byDate'
....
where $PARTITION.pf_byDate(DateEND) = @f 

Или просто в качестве @f воткнуть константу, если кол-во секций постоянно (как у меня).

Ну и при выставлении сущности реального DateEND ( как правило это GetDate() ), данные просто будут физически перемещаться из [FG9999] в предыдущую файловую группу.

PS.
Минусы:
1) Операция update - замедлится. Но как правило не сильно, т.к. не обчно это не массовая операция.
2) Перелопатить кучу говно-кода пракически не реально. Во всяком случае мне не удалось
11 янв 12, 14:03    [11885077]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование : как поменять местами секции  [new]
Panf
Member

Откуда: Kiev
Сообщений: 62
Спасибо товарищи!

Буду разбираться.
Меня кто-то ввел в заблуждение, что RIGHT от LEFT отличается лишь включением указанной границы в диапазон или невключением...!

P.S. Я так понял, что для исправления ситуации в любом случае нужно убивать таблицы использующие эту схему и функцию? (
12 янв 12, 12:53    [11891598]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование : как поменять местами секции  [new]
mike909
Member

Откуда:
Сообщений: 662
Panf
Спасибо товарищи!

Буду разбираться.
Меня кто-то ввел в заблуждение, что RIGHT от LEFT отличается лишь включением указанной границы в диапазон или невключением...!

Данное утверждение верно.
Но для понимания лучше наверное следующее утверждение:
Ф-я RIGHT от LEFT отличается тем, что занчение поля секционирования точно равное границе попадет справа для RIGHT ф-ии и слева для LEFT.

Panf
P.S. Я так понял, что для исправления ситуации в любом случае нужно убивать таблицы использующие эту схему и функцию? (

Да нет, не обязательно я привел решение влоб которое точно прокатит.
Но для варианта без удаления таблицы/схемы/функции нужно точное понимание, что Вы делаете. Да и времении это займет побольше т.к. придется больше команд выполнить , а еще и думать (о последствиях) придется
12 янв 12, 13:24    [11891888]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить