Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Абракадабра
Guest |
Добрый день, Есть партиционированная таблица, которая использует: CREATE PARTITION SCHEME [FY] AS PARTITION [FY] TO ([PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY]); GO CREATE PARTITION FUNCTION [FY](INT) AS RANGE LEFT FOR VALUES (20110700, 20120700, 20130700); При добавление новой партиции, для которой данных еще нету (масимальное значение в таблице 20130630): ALTER PARTITION SCHEME [FY] NEXT USED [PRIMARY]; GO ALTER PARTITION FUNCTION [FY] () SPLIT RANGE (20140700); Сиквел начинает перемещать данные. Этот процесс занимает много времени, а дальше ему не хватает места и база уходит в suspect. Как сделать чтоб не было перемещения данных? |
7 окт 14, 10:15 [16669617] Ответить | Цитировать Сообщить модератору |
Абракадабра
Guest |
Простите опечатался, масимальное значение в таблице 20140630 |
7 окт 14, 12:12 [16670350] Ответить | Цитировать Сообщить модератору |
смотрю_тут Member Откуда: Сообщений: 1368 |
Абракадабра, скрипт PARTITION SCHEME [FY] после изменения схемы смотрели, там 5 раз используется файловая группы primary? |
7 окт 14, 12:27 [16670453] Ответить | Цитировать Сообщить модератору |
Абракадабра
Guest |
смотрю_тут, Дальше используются 4ре. Как сделать чтоб было 5 раз? |
7 окт 14, 12:40 [16670549] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8316 |
Вы занимаетесь какими-то странными делами. Создайте сразу таблицу с требуемыми секциями и залейте в нее данные из старой. |
7 окт 14, 13:05 [16670713] Ответить | Цитировать Сообщить модератору |
Абракадабра
Guest |
Владислав Колосов, Таблиц много фактов несколько, данных в них много, а места на сервере мало. |
7 окт 14, 13:22 [16670812] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8316 |
Абракадабра, Вот как раз для этого мой совет, сэкономите место и время. Можете заливать отфильтрованные данные порциями. Перераспределение секций не слишком производительная операция. Убедитесь, особенно, что таблицы не сжаты. |
7 окт 14, 13:38 [16670926] Ответить | Цитировать Сообщить модератору |
Абракадабра
Guest |
Владислав Колосов, Спасибо, но как-то такой вариант мне не сильно нравится, т.к. все таблицы сжатые, индексы тоже. Хотелось, просто добавить в существующую структуру пустые партции. Ваш вариант самый простой, но я надеюсь, что есть адекватное решение. |
7 окт 14, 14:31 [16671294] Ответить | Цитировать Сообщить модератору |
a_voronin Member Откуда: Москва Сообщений: 4807 |
Зачем тогда партиционирование. Вы в правильной последовательности команды пускаете? http://msdn.microsoft.com/en-us/library/hh510199.aspx USE AdventureWorks2012; GO -- add five new filegroups to the AdventureWorks2012 database ALTER DATABASE AdventureWorks2012 ADD FILEGROUP test1fg; GO ALTER DATABASE AdventureWorks2012 ADD FILEGROUP test2fg; GO ALTER DATABASE AdventureWorks2012 ADD FILEGROUP test3fg; GO ALTER DATABASE AdventureWorks2012 ADD FILEGROUP test4fg; GO ALTER DATABASE AdventureWorks2012 ADD FILEGROUP test5fg; GO -- if the "myRangePF1" partition function and the "myRangePS1" partition scheme exist, -- drop them from the AdventureWorks2012 database IF EXISTS (SELECT * FROM sys.partition_functions WHERE name = 'myRangePF1') DROP PARTITION FUNCTION myRangePF1; GO IF EXISTS (SELECT * FROM sys.partition_schemes WHERE name = 'myRangePS1') DROP PARTITION SCHEME myRangePS1; GO -- create the new partition function "myRangePF1" with four partition groups CREATE PARTITION FUNCTION myRangePF1 (int) AS RANGE LEFT FOR VALUES ( 1, 100, 1000 ); GO -- create the new partition scheme "myRangePS1"that will use -- the "myRangePF1" partition function with five file groups. -- The last filegroup, "test5fg," will be kept empty but marked -- as the next used filegroup in the partition scheme. CREATE PARTITION SCHEME myRangePS1 AS PARTITION myRangePF1 TO (test1fg, test2fg, test3fg, test4fg, test5fg); GO --Split "myRangePS1" between boundary_values 100 and 1000 --to create two partitions between boundary_values 100 and 500 --and between boundary_values 500 and 1000. ALTER PARTITION FUNCTION myRangePF1 () SPLIT RANGE (500); GO -- Allow the "myRangePS1" partition scheme to use the filegroup "test5fg" -- for the partition with boundary_values of 100 and 500 ALTER PARTITION SCHEME myRangePS1 NEXT USED test5fg; GO |
||
7 окт 14, 15:13 [16671606] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31780 |
Если такую операцию нельзя сделать без переливки данных, то зачем тогда нужно это партицирование, в чём его смысл? Мне тоже кажется, что где то нарушен порядок операций... |
||
7 окт 14, 15:23 [16671689] Ответить | Цитировать Сообщить модератору |
a_voronin Member Откуда: Москва Сообщений: 4807 |
Нужно сначала ALTER PARTITION FUNCTION, а уже потом ALTER PARTITION SCHEME |
||
7 окт 14, 15:25 [16671699] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8316 |
Учтите, что в вашем варианте будут пережаты все данные и индексы, это займет намного больше времени, чем просто залить в подготовленные несжатые таблицы с секциями и затем их сжать. |
||
7 окт 14, 15:58 [16671954] Ответить | Цитировать Сообщить модератору |
a_voronin Member Откуда: Москва Сообщений: 4807 |
Я вот в упор не могу понять, почему все будут переезжать. |
||
7 окт 14, 16:21 [16672112] Ответить | Цитировать Сообщить модератору |
Критик Member Откуда: Москва / Калуга Сообщений: 34727 Блог |
ну как же, на последней секции стоит виртуальный check с одной границей (a > 500), когда ТС пытается выполнить split, сервер просто вынужден сканировать/сортировать все последние секции всех секционированных по некоторой схеме таблиц |
||
7 окт 14, 17:32 [16672666] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8704 |
Абракадабра, Делайте split либо пустых секций, либо секций, в которых у всех индексов всех таблиц первое поле ключа индекса = ключу секционирования. Иначе SQL будет вынужден просканировать всю секцию для выяснения какие записи в какую секцию нужно поместить |
7 окт 14, 17:42 [16672741] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31780 |
Секция, которую делят, должна быть пустая. Это просто ошибка при планировании партицирования. Нужно было оставить пустую секцию справа, и перед началом загрузки данных, которые попадают в правую секцию, создавать новую секцию. Если это правило соблюдать, то всё будет быстро и не будет требовать ресурсов. |
||||||
7 окт 14, 17:54 [16672794] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8316 |
Что, если переключить секцию, в таблице образуется пустая, ее разбить, а затем переключить секцию обратно? |
7 окт 14, 18:28 [16672974] Ответить | Цитировать Сообщить модератору |
Критик Member Откуда: Москва / Калуга Сообщений: 34727 Блог |
Чтобы переключить обратно, у "вынутого" куска таблицы должны быть несколько несовместимых ограничений по значению поля секционирования, так что не вариант. А уж если у ТС не одна такая таблица... )) Я бы создал новую схему/функцию и по 1 таблице переносил их туда через таблицы-копии. Но это будет медленно и печально ) |
||
7 окт 14, 21:24 [16673498] Ответить | Цитировать Сообщить модератору |
NickAlex66 Member Откуда: Сообщений: 319 |
Абракадабра, Вот тут все ответы на все озвученные тут вопросы. ЗЫ: в вашем конкретном случае LEFT - то, что вам мешает. Поставите RIGHT и проблема уйдет. Еще раз это будет верно только в вашем конкретном слечае. |
7 окт 14, 21:33 [16673512] Ответить | Цитировать Сообщить модератору |
Абракадабра
Guest |
Спасибо всем за помощь. Помогло отстегивание партиций в таблички и потом сплит пустых. |
7 окт 14, 22:10 [16673583] Ответить | Цитировать Сообщить модератору |
pio777 Member Откуда: Сообщений: 127 |
NickAlex66, Вот и статья по этому поводу: Тыц |
7 окт 14, 22:55 [16673630] Ответить | Цитировать Сообщить модератору |
NickAlex66 Member Откуда: Сообщений: 319 |
pio777, ТС скорее писатель, нежели читатель. И потом, некоторых участников форума прет от изобретения велосипеда пусть и с квадратными колесами, но своего. |
8 окт 14, 01:09 [16673936] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |