W SQL Server możesz użyć ALTER PARTITION FUNCTION
aby połączyć dwie partycje w jedną partycję.
Aby to zrobić, użyj MERGE RANGE
argument, podając wartość graniczną partycji do usunięcia.
Ta operacja usuwa partycję i łączy wszystkie wartości istniejące w partycji z pozostałą partycją.
Przykład
Wyobraź sobie, że mamy pięć partycji, które chcemy stać się czterema.
Aktualne partycje
Mamy funkcję partycji o nazwie MoviesPartitionFunction
z czterema wartościami granicznymi.
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 |+---------------+---------+
Oznacza to, że istnieje pięć partycji.
W tym przykładzie zmniejszymy zakres granic 500.
Wyobraź sobie również, że mamy już tabelę z danymi rozproszonymi na niektórych z tych partycji.
Oto, jak wiersze są obecnie rozłożone 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 |+---------------------+-------------+
Powinienem zaznaczyć, że Microsoft faktycznie odradza łączenie (lub dzielenie) partycji zawierających dane. Jednak na potrzeby tego przykładu rzucimy ostrożność i połączymy dwie partycje zawierające dane.
Połącz partycje
OK, połączmy partycje.
ALTER PARTITION FUNCTION MoviesPartitionFunction()
MERGE RANGE (500);
Wynik:
Polecenia zakończone pomyślnie.
Pomyślnie połączyliśmy partycje.
Sprawdź wynik
Sprawdźmy wynik.
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 | 10000 |+---------------+---------+
Zgodnie z oczekiwaniami, zakres graniczny 500 został porzucony i pozostały tylko trzy zakresy graniczne.
Zobaczmy, jak dane są rozłożone 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 | 3979 || 4 | 0 |+---------------------+-------------+
Ponownie zgodnie z oczekiwaniami dane z partycji 3 i 4 połączyły się w jedną partycję (partycja 3).
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.
Scalanie partycji zawierających dane
Jak wspomniano, Microsoft odradza łączenie 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.