powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Господа секционоиды! Нужен совет
9 сообщений из 9, страница 1 из 1
Господа секционоиды! Нужен совет
    #35458061
Alx65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Перед переходом на боевую базу играюсь на "ленточной"

Имею

Код: plaintext
Microsoft SQL Server  2005  -  9 . 00 . 3042 . 00  (X64)   Feb  10   2007   00 : 59 : 02    Copyright (c)  1988 - 2005  Microsoft Corporation  Enterprise Edition ( 64 -bit) on Windows NT  5 . 2  (Build  3790 : Service Pack  2 ) 

Имею секционированную таблицу

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select * from sys.partition_range_values where function_id=@fid;

 65537 	 1 	 1 	 80500 
 65537 	 2 	 1 	 80600 
 65537 	 3 	 1 	 80700 

select * from sys.partitions where object_id = OBJECT_ID(N'[dbo].[OldStat]',N'U') order by partition_number 

 72057594574471168 	 747253817 	 1 	 1 	 72057594574471168 	 0 
 72057594574405632 	 747253817 	 1 	 2 	 72057594574405632 	 794541673 
 72057594574536704 	 747253817 	 1 	 3 	 72057594574536704 	 0 
 72057594512736256 	 747253817 	 1 	 4 	 72057594512736256 	 0 

Во второй секции данные имеют значения в поле секционирования:

Код: plaintext
1.
2.
3.
4.
select distinct dt,count(*) from OldStat group by dt

 80501 	 246462869 
 80502 	 263021687 
 80503 	 285057117 

В таблице бОльших значений чем 80503 нету

Код: plaintext
1.
2.
select count(*) from OldStat where dt> 80503 

 0 

Партишион схема выглядит так

Код: plaintext
CREATE PARTITION SCHEME [myRangePS1] AS PARTITION [myRangePF1] TO ([PRIM4], [PRIM4], [PRIM4], [PRIM3])

При попытке выполнения

Код: plaintext
1.
ALTER PARTITION SCHEME myRangePS1  NEXT USED [PRIM4];
ALTER PARTITION FUNCTION myRangePF1 () SPLIT RANGE ( 80504 );

начинаются раздумья, невероятный рост лога (съедается все что есть). Заканчивается ролбэком.


В чем грабли?
...
Рейтинг: 0 / 0
Господа секционоиды! Нужен совет
    #35458727
Alx65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробую "поднять" тему.

С моей точки зрения SPLIT должен изменить только метаданные, т.е. операция должна быть мгновенной, а занимает более 6 часов.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Господа секционоиды! Нужен совет
    #36567727
Vitaly86
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
извините, что поднимаю старую тему,
но действительно хотелось бы понять процесс.
Что же всё таки "физически" происходит когда делаешь:
Код: plaintext
1.
ALTER PARTITION FUNCTION myRangePF1 () SPLIT RANGE ( 80504 );
...
Рейтинг: 0 / 0
Господа секционоиды! Нужен совет
    #36569593
Фотография Александр Волок (def1983)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vitaly86извините, что поднимаю старую тему,
но действительно хотелось бы понять процесс.
Что же всё таки "физически" происходит когда делаешь:
Код: plaintext
1.
ALTER PARTITION FUNCTION myRangePF1 () SPLIT RANGE ( 80504 );

В новую партицию перегоняются данные.

http://www.mssqltips.com/tip.asp?tip=1914

Myth 6: Altering a partition function is a metadata only operation

In practice you may find out that a MERGE or SPLIT operation may take much much longer than the few seconds expected. Altering a partition function is an offline operation and can also result in movement of data on disk and so become extremely resource intensive.
...
To avoid or minimize data movement when SPLITing a partition function always ensure that you know beforehand how many rows are in the underlying partition that is being SPLIT and how many rows would fall on each side of the new boundary. Armed with this information you should be able to determine beforehand the amount of data movement to expect depending on whether you have defined your partition function using RANGE RIGHT or LEFT.
...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Господа секционоиды! Нужен совет
    #40073809
selis76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подниму эту старую тему,
Эксперементировал с партициями по 10 миллионов записей на тестовой бд но уже на SQL server 2019. Попал на такую же ситуацию
была функция
Код: sql
1.
CREATE PARTITION FUNCTION [PF_bufMsgCounter](bigint) AS RANGE LEFT FOR VALUES (2380000000, 2540000000, 2550000000, 2560000000)



Заполнил данные диапазона >= 2560000000 значениями меньшими 2590000000. При попытки сделать

Код: sql
1.
ALTER PARTITION FUNCTION PF_bufMsgCounter() SPLIT RANGE (2590000000);



начинается огромный рост лога и перемещение данных. Получается последний диапазон какой то магический даже если split делаешь за границей реальных данных она всеравно занимается перемещениями строк. Если бы после >= 2560000000 ничего не было, диапазон разбился бы быстро

Вопрос : Есть ли в SQL 2019 возможность избежать такой ситуации? Или последний дипазон не считается партицией?
...
Рейтинг: 0 / 0
Господа секционоиды! Нужен совет
    #40073810
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Господа секционоиды! Нужен совет
    #40073814
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
selis76
начинается огромный рост лога и перемещение данных.

Это бывает, когда сделаны разные файловые группы для диапазонов.
...
Рейтинг: 0 / 0
Господа секционоиды! Нужен совет
    #40073815
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
selis76
Подниму эту старую тему,
Эксперементировал с партициями по 10 миллионов записей на тестовой бд но уже на SQL server 2019. Попал на такую же ситуацию
была функция
Код: sql
1.
CREATE PARTITION FUNCTION [PF_bufMsgCounter](bigint) AS RANGE LEFT FOR VALUES (2380000000, 2540000000, 2550000000, 2560000000)




Заполнил данные диапазона >= 2560000000 значениями меньшими 2590000000. При попытки сделать

Код: sql
1.
ALTER PARTITION FUNCTION PF_bufMsgCounter() SPLIT RANGE (2590000000);





начинается огромный рост лога и перемещение данных. Получается последний диапазон какой то магический даже если split делаешь за границей реальных данных она всеравно занимается перемещениями строк. Если бы после >= 2560000000 ничего не было, диапазон разбился бы быстро

Вопрос : Есть ли в SQL 2019 возможность избежать такой ситуации? Или последний дипазон не считается партицией?



То, какая из "половинок" диапазона при сплите станет новой партицией а какая останется текущей зависит от вот этого свойства

Код: sql
1.
AS RANGE LEFT FOR VALUES




Замените ее на RIGHT и попробуйте еще раз.
...
Рейтинг: 0 / 0
Господа секционоиды! Нужен совет
    #40073967
selis76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич


Спасибо
Сделал switch - убрал данные последней партиции в другую таблицу, засплитил и вернул назад.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Господа секционоиды! Нужен совет
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]