Ако имате разделена таблица или индекс в SQL Server, но имате нужда от повече дялове, можете да добавите дял към функцията за дял, като използвате ALTER PARTITION FUNCTION
израз с SPLIT RANGE
аргумент.
Когато направите това, разделяте съществуващ дял на две.
Пример
Ето пример за демонстрация. Първо, нека разгледаме текущата ни настройка.
Текуща настройка
Вече имаме четири дяла и искаме да добавим пети.
Така че вече създадохме функция за дялове като тази:
CREATE PARTITION FUNCTION MoviesPartitionFunction (int)
AS RANGE LEFT FOR VALUES (-1, 100, 10000);
Този код води до дялове, които съхраняват стойности, както следва.
Дял | Стойности |
---|---|
1 | <=–1 |
2 | > –1 И <=100 |
3 | > 100 И <=10000 |
4 | > 10000 |
За този пример ще добавим нова гранична стойност от 500.
Затова искаме да изглежда така:
Дял | Стойности |
---|---|
1 | <=–1 |
2 | > –1 И <=100 |
3 | > 100 И <=500 |
4 | > 500 И <=10000 |
5 | > 10000 |
Също така, за целите на този пример, представете си, че имаме таблица, която е разделена с помощта на горната функция за дял и в момента съдържа малко над четири хиляди реда данни.
Нека да разгледаме набързо как са разпределени редовете между нашите дялове:
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Резултат:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 3979 | | 4 | 0 | +--------------------+-------------+
Така че сега искаме да добавим нов дял с гранична стойност 500.
В този случай ще разделим дяла между гранични стойности 100 и 10000.
Трябва да спомена, че Microsoft препоръчва да не се разделят населените дялове. Така че това е нещо, което трябва да имате предвид.
Въпреки това, за целите на този пример, ние ще разделим дял, който съдържа данни.
Разделете дяла
Ето къде продължаваме и разделяме дяла.
Използваме ALTER PARTITION FUNCTION
оператор за разделяне на дяла.
Въпреки това, разделянето на дял създава два дяла от един и затова трябва да се уверим, че има файлова група за новия дял. Също така трябва да се уверим, че нашата схема на дялове знае коя файлова група да използва, когато разделим дяла.
Можете да използвате съществуваща файлова група или да създадете нова.
Нека създадем нов.
Ето кода, който можем да използваме, за да направим всичко по-горе:
ALTER DATABASE Test ADD FILEGROUP MoviesFg5;
ALTER DATABASE Test
ADD FILE
(
NAME = MoviesFg5dat,
FILENAME = '/var/opt/mssql/data/MoviesFg5dat.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP MoviesFg5;
ALTER PARTITION SCHEME MoviesPartitionScheme
NEXT USED MoviesFg5;
ALTER PARTITION FUNCTION MoviesPartitionFunction()
SPLIT RANGE (500);
Резултат:
Commands completed successfully.
Успешно разделихме дяла.
Проверете разделянето
Вече можем да проверим дали функцията на дял е променена, за да отразява новите гранични стойности.
SELECT
prv.boundary_id,
prv.[value]
FROM sys.partition_range_values prv
INNER JOIN sys.partition_functions pf
ON prv.function_id = pf.function_id
WHERE pf.name = 'MoviesPartitionFunction';
Резултат:
+---------------+---------+ | boundary_id | value | |---------------+---------| | 1 | -1 | | 2 | 100 | | 3 | 500 | | 4 | 10000 | +---------------+---------+
Така можем да видим, че новата гранична стойност е добавена успешно.
И ето как сега данните се разпределят между дяловете.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Резултат:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 400 | | 4 | 3579 | | 5 | 0 | +--------------------+-------------+
Така че сега имаме 5 дяла.
Защо да имаме празни дялове?
Ако се чудите защо имам празни дялове във всеки край, това се прави специално, за да се улесни разделянето и сливането на дяловете.
Поддържането на празни дялове от всеки край предотвратява всяко неочаквано движение на данни, което може да получите при разделяне или сливане на дялове.
Тази практика се препоръчва и от Microsoft, точно по тази причина.
Разделяне на дялове, които съдържат данни
Както споменахме, Microsoft препоръчва да не се разделят дялове, които вече съдържат данни.
Разделянето или сливането на населени дялове може да бъде неефективно. Те могат да бъдат неефективни, тъй като разделянето или сливането може да доведе до четири пъти повече генериране на регистрационни файлове и може също да причини сериозно заключване.