Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
lex452 Member Откуда: Сообщений: 588 |
Попробую сформулировать суть вопроса, есть секционированная таблица по датам, Файловые группы LeftFG и RightFG всегда пустые, для возможного расщепления При попытке добавить данные за новую дату 201701112 я добавляю новый RANGE, который должен разбить крайнюю пустую секцию, которая хранится в RightFG на две, залить данные в новую FG 20170112FG(заранее созданную) и оставить пустую секцию. Мне не понятно как сервер определяет что данные нужно заносить в 20170112FG, RightFG оставить пустой, а не наоборот. USE TestDB; GO -- add five new filegroups to the TestDB database ALTER DATABASE TestDB ADD FILEGROUP LeftFG; GO ALTER DATABASE TestDB ADD FILEGROUP 20170110FG; GO ALTER DATABASE TestDB ADD FILEGROUP 20170111FG; GO ALTER DATABASE TestDB ADD FILEGROUP RightFG; GO CREATE PARTITION FUNCTION myRangePF1 (int) AS RANGE RIGHT FOR VALUES ( '20170110', '20170111', '201701112' ); GO CREATE PARTITION SCHEME myRangePS1 AS PARTITION myRangePF1 TO (LeftFG, 20170110FG, 20170111FG, RightFG); GO ALTER DATABASE TestDB ADD FILEGROUP 20170112FG GO ALTER DATABASE TestDB ADD FILE (NAME='20170112File', FILENAME='d:\data\20170112File') TO FILEGROUP 20170112FG; GO ALTER PARTITION SCHEME myRangePS1 NEXT USED 20170112FG; GO ALTER PARTITION FUNCTION myRangePF1 () SPLIT RANGE ('201701113'); GO |
6 фев 17, 22:07 [20186675] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
lex452, это у вас даты такие? |
7 фев 17, 10:09 [20187568] Ответить | Цитировать Сообщить модератору |
SQL2008 Member Откуда: Москва Сообщений: 4400 |
Тоже стало интересно
'201701112'
Это 112-е января? Сначала выносите мозг скулю, а потом обижаетесь на него, что неправильно работает. |
||
7 фев 17, 11:56 [20188113] Ответить | Цитировать Сообщить модератору |
lex452 Member Откуда: Сообщений: 588 |
Видно же что опечатался, да это секционирование по датамUSE TestDB; GO -- add five new filegroups to the TestDB database ALTER DATABASE TestDB ADD FILEGROUP LeftFG; GO ALTER DATABASE TestDB ADD FILEGROUP 20170110FG; GO ALTER DATABASE TestDB ADD FILEGROUP 20170111FG; GO ALTER DATABASE TestDB ADD FILEGROUP RightFG; GO CREATE PARTITION FUNCTION myRangePF1 (int) AS RANGE RIGHT FOR VALUES ( N'2017-01-10', N'2017-01-11', N'20170112' ); GO CREATE PARTITION SCHEME myRangePS1 AS PARTITION myRangePF1 TO (LeftFG, 20170110FG, 20170111FG, RightFG); GO ALTER DATABASE TestDB ADD FILEGROUP 20170112FG GO ALTER DATABASE TestDB ADD FILE (NAME='20170112File', FILENAME='d:\data\20170112File') TO FILEGROUP 20170112FG; GO ALTER PARTITION SCHEME myRangePS1 NEXT USED 20170112FG; GO ALTER PARTITION FUNCTION myRangePF1 () SPLIT RANGE (N'2017-01-13'); GO |
7 фев 17, 12:47 [20188390] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37151 |
Делать int-функцию для дат весьма оригинально. Туда не только 112е января поместится... |
7 фев 17, 13:23 [20188604] Ответить | Цитировать Сообщить модератору |
lex452 Member Откуда: Сообщений: 588 |
Гавриленко Сергей Алексеевич, я вроде написал исправленную версию, так что с сарказмом опоздали. |
7 фев 17, 19:51 [20190452] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37151 |
В каком месте она исправлена-то? CREATE PARTITION FUNCTION myRangePF1 (int) AS RANGE RIGHT FOR VALUES ( N'2017-01-10', N'2017-01-11', N'20170112' ); |
||
7 фев 17, 20:01 [20190462] Ответить | Цитировать Сообщить модератору |
Критик Member Откуда: Москва / Калуга Сообщений: 34750 Блог |
добавляемые данные сортируются в tempdb и на основе метаданных функции секционирования определяется нужная секция |
||
7 фев 17, 20:20 [20190494] Ответить | Цитировать Сообщить модератору |
lex452 Member Откуда: Сообщений: 588 |
Гавриленко Сергей Алексеевич, Извиняюсь, недосмотрел DateTime там конечно |
7 фев 17, 21:46 [20190660] Ответить | Цитировать Сообщить модератору |
lex452 Member Откуда: Сообщений: 588 |
Ответ обо всем и ни о чем. После того как я разбиваю SPLIT секцию новой точкой например секцию с данными от 2017-01-12 до бесконечности точкой 2017-01-13. Добавляю 20170113FG по какому принципу сервер данные за 12 число кладет в 20170112FG, а в 20170113FG данные от 13 до бесконечности |
||||
7 фев 17, 21:51 [20190671] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
А потом уже разбиваете SPLIT секцию новой точкой, и сервер, в соответствии с вашими предыдущими указаниями, привязывает новый диапазон к этой файлгруппе.
Ну вот, можете посмотреть метаданные по вашим секциям и файлгруппам: -- Статистика по файлгруппам и файлам SELECT fg.name as FileGroupName, fg.is_read_only, df.name as LogicalFileName, df.physical_name as FileName, --r.value as [Native range], case when f.type = 'R' THEN '>= ' ELSE '<= ' END + convert(varchar(24), r.value, 120) AS [Native range], sum(p.rows) as rows, max(convert(decimal(18,3), convert(decimal(18,3), df.size) * 8196 / (1024*1024*1024))) as [FileSize_GB], max(convert(decimal(18,3), convert(decimal(18,3), FILEPROPERTY(df.name, 'SpaceUsed')) * 8196 / (1024*1024*1024))) as [SpaceUsed_GB] FROM sys.indexes i JOIN sys.tables t ON (t.object_id = i.object_id) JOIN sys.partition_schemes ps ON (i.data_space_id = ps.data_space_id) JOIN sys.partition_functions f ON f.function_id = ps.function_id JOIN sys.destination_data_spaces dds ON (ps.data_space_id = dds.partition_scheme_id) LEFT JOIN sys.partition_range_values r on r.function_id = f.function_id and r.boundary_id + cast(f.boundary_value_on_right as int) = dds.destination_id JOIN sys.partitions p ON p.object_id = i.object_id and p.index_id = i.index_id and p.partition_number = dds.destination_id JOIN sys.filegroups fg ON dds.data_space_id = fg.data_space_id JOIN sys.database_files df ON df.data_space_id = fg.data_space_id WHERE (i.index_id IN (0,1)) GROUP BY fg.name, fg.is_read_only, df.name, df.physical_name, case when f.type = 'R' THEN '>= ' ELSE '<= ' END + convert(varchar(24), r.value, 120) --r.value ORDER BY FileGroupName, LogicalFileName |
||||
8 фев 17, 00:35 [20190946] Ответить | Цитировать Сообщить модератору |
lex452 Member Откуда: Сообщений: 588 |
Примерно это и хотел услышать Только у меня созрел еще вопрос, Я читал что когда используешь RANGE RIGHT то слева всегда пустая секция и ее надо разбивать. Как лучше сделать, когда у меня данные могут добавляться и слева и справа, возможно ли сделать чтобы и слева и справа была пустая секция и в случае добавления данных расщеплялась всегда пустая секция, а не с данными? Или на производительность это не сильно скажется? |
||
9 фев 17, 12:50 [20196374] Ответить | Цитировать Сообщить модератору |
Knyazev Alexey Member Откуда: Екб -> Мск Сообщений: 10234 Блог |
[quote lex452]
очень может сказаться, если данных будет много и их сиквелу придётся перемещать |
||
9 фев 17, 12:53 [20196383] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
Вам ничего не мешает справа добавить новую правую секцию до того, как вы начали писать данные в существующую последнюю правую секцию. |
||||
9 фев 17, 14:41 [20196942] Ответить | Цитировать Сообщить модератору |
lex452 Member Откуда: Сообщений: 588 |
alexeyvg,
То есть поправьте если ошибаюсь. У меня в таблице крайняя секция за 12 число (от 12 до бесконечности, но данных в ней нет) чтобы добавить данные за 14 число, мне нужно создать секцию за 13(будет пустая), за 14 число (туда я буду заливать данные ) и за 15 число (будет крайняя и пустая для будущего расщепления) или есть более простой способ? И как мне в данном случае назначить файловые группы для пустых секций для которых нет еще данных? |
||
13 фев 17, 12:42 [20207026] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |