Jeśli masz partycjonowaną tabelę lub indeks w SQL Server, ale potrzebujesz więcej partycji, możesz dodać partycję do funkcji partycji za pomocą ALTER PARTITION FUNCTION
oświadczenie z SPLIT RANGE
argument.
Kiedy to zrobisz, podzielisz istniejącą partycję na dwie.
Przykład
Oto przykład do zademonstrowania. Najpierw spójrzmy na naszą obecną konfigurację.
Aktualna konfiguracja
Mamy już cztery partycje i chcemy dodać piątą.
Stworzyliśmy już taką funkcję partycji:
CREATE PARTITION FUNCTION MoviesPartitionFunction (int)
AS RANGE LEFT FOR VALUES (-1, 100, 10000);
Ten kod skutkuje partycjami, które przechowują wartości w następujący sposób.
Partycja | Wartości |
---|---|
1 | <=–1 |
2 | > –1 ORAZ <=100 |
3 | > 100 ORAZ <=10000 |
4 | > 10000 |
W tym przykładzie dodamy nową wartość graniczną 500.
Więc chcemy, żeby wyglądało to tak:
Partycja | Wartości |
---|---|
1 | <=–1 |
2 | > –1 ORAZ <=100 |
3 | > 100 ORAZ <=500 |
4 | > 500 ORAZ <=10000 |
5 | > 10000 |
Ponadto na potrzeby tego przykładu wyobraź sobie, że mamy tabelę podzieloną na partycje za pomocą powyższej funkcji partycjonowania, która obecnie zawiera nieco ponad cztery tysiące wierszy danych.
Rzućmy okiem na to, jak wiersze są rozłożone na naszych partycjach:
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Wynik:
+---------------------+--------------+| numer_partycji | liczba_wierszów ||--------------------+-------------||| 1 | 0 || 2 | 100 || 3 | 3979 || 4 | 0 |+---------------------+-------------+
Dlatego teraz chcemy dodać nową partycję z wartością graniczną 500.
W takim przypadku podzielimy partycję między wartości graniczne 100 i 10000.
Powinienem wspomnieć, że Microsoft odradza dzielenie zaludnionych partycji. Warto o tym pamiętać.
Jednak na potrzeby tego przykładu podzielimy partycję zawierającą dane.
Podziel partycję
Oto, gdzie idziemy dalej i dzielimy partycję.
Używamy ALTER PARTITION FUNCTION
oświadczenie o podzieleniu partycji.
Jednak podzielenie partycji tworzy dwie partycje z jednej, dlatego musimy upewnić się, że istnieje grupa plików dla nowej partycji. Musimy również upewnić się, że nasz schemat partycji wie, której grupy plików użyć podczas dzielenia partycji.
Możesz użyć istniejącej grupy plików lub możesz utworzyć nową.
Stwórzmy nowy.
Oto kod, którego możemy użyć, aby wykonać wszystkie powyższe czynności:
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);
Wynik:
Polecenia zakończone pomyślnie.
Pomyślnie podzieliliśmy partycję.
Zweryfikuj podział
Możemy teraz sprawdzić, czy funkcja partycji została zmodyfikowana w celu odzwierciedlenia nowych wartości granicznych.
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';
Wynik:
+---------------+---------+| identyfikator_granicy | wartość ||---------------+---------|| 1 | -1 || 2 | 100 || 3 | 500 || 4 | 10000 |+---------------+---------+
Widzimy więc, że nowa wartość graniczna została pomyślnie dodana.
A oto jak dane są teraz rozprowadzane na partycjach.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Wynik:
+---------------------+--------------+| numer_partycji | liczba_wierszów ||--------------------+-------------||| 1 | 0 || 2 | 100 || 3 | 400 || 4 | 3579 || 5 | 0 |+---------------------+-------------+
Więc mamy teraz 5 partycji.
Dlaczego są puste partycje?
Jeśli zastanawiasz się, dlaczego mam puste partycje na każdym końcu, jest to zrobione specjalnie, aby ułatwić dzielenie i łączenie partycji.
Utrzymywanie pustych partycji na obu końcach zapobiega wszelkim nieoczekiwanym przesunięciom danych, które mogą wystąpić podczas dzielenia lub łączenia partycji.
Ta praktyka jest również zalecana przez firmę Microsoft, właśnie z tego powodu.
Podział partycji zawierających dane
Jak wspomniano, Microsoft odradza dzielenie partycji, które już zawierają dane.
Dzielenie lub scalanie zaludnionych partycji może być nieefektywne. Mogą być nieefektywne, ponieważ dzielenie lub łączenie może powodować nawet czterokrotnie więcej generowania logów, a także może powodować poważne blokowanie.