Udostępnij za pomocą


FUNKCJA PODZIAŁU ALTER (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

Zmienia funkcję podziału poprzez rozdzielenie lub łączenie jej wartości brzegowych. Uruchomienie instrukcji ALTER PARTITION FUNCTION może podzielić jedną tabelę lub indeks partycji korzystającej z funkcji partycji na dwie partycje. To stwierdzenie może również połączyć dwie partycje w jedną partycję.

Ostrzeżenie

Więcej niż jedna tabela lub indeks może używać tej samej funkcji partycji. ALTER PARTITION FUNCTION wpływa na wszystkie w jednej transakcji.

Transact-SQL konwencje składni

Składnia

  
ALTER PARTITION FUNCTION partition_function_name()  
{   
    SPLIT RANGE ( boundary_value )  
  | MERGE RANGE ( boundary_value )   
} [ ; ]  

Arguments

partition_function_name
to nazwa funkcji partycji, którą ma się modyfikować.

ZASIĘG PODZIAŁU ( boundary_value )
Dodaje jedną partycję do funkcji partycji. boundary_value określa zakres nowej partii i musi różnić się od istniejących zakresów brzegowych funkcji podziału. Na podstawie boundary_value silnik bazy danych dzieli jeden z istniejących zakresów na dwa. Spośród tych dwóch zakresów, ten z nowym boundary_value jest nowym podziałem.

Grupa plików musi istnieć online. A schemat partycji, który używa funkcji partycji jako NEXT USED do przechowywania nowej partycji, musi oznaczać grupę plików. Polecenie CREATE PARTITION SCHEME przypisuje grupom plików do partycji. Instrukcja CREATE PARTITION FUNCTION tworzy mniej partycji niż grupy plików, które je pomieściły. Instrukcja CREATE PARTITION SCHEME może odłożyć więcej grup plików niż jest to potrzebne. Jeśli tak się stanie, skończysz z nieprzypisanymi grupami plików. Ponadto schemat partycjonowania oznacza jedną z grup plików jako NEXT USED. Ta grupa plików przechowuje nową partycję. Jeśli nie ma grup plików, schemat partycji oznacza jako NEXT USED, musisz użyć instrukcji ALTER PARTITION SCHEME.

Instrukcja ALTER PARTITION SCHEME może dodać grupę plików lub wybrać istniejącą, aby przechowywać nową partycję. Możesz przypisać grupę plików, która już posiada partycje, do przechowywania dodatkowych partycji. Funkcja partycji może uczestniczyć w więcej niż jednym schemacie partycji. Z tego powodu wszystkie schematy partycji wykorzystujące funkcję partycji, do której dodajesz partycje, muszą mieć grupę plików NEXT USED. W przeciwnym razie instrukcja ALTER PARTITION FUNCTION nie ulega błędowi, który wyświetla schemat partycji lub schematy pozbawione grupy plików NEXT USED.

Jeśli utworzysz wszystkie partycje w tej samej grupie plików, ta grupa plików jest automatycznie przypisana jako NASTĘPNA UŻYTA grupa. Jednak po uruchomieniu operacji split nie ma już wybranej grupy plików NEXT USED. Wyraźne przypisanie grupy plików jako NASTĘPNEJ UŻYTEJ grupy plików, używając ALTER PARTITION SCHEME, bo nadchodząca operacja podziału się nie powiedzie.

Uwaga / Notatka

Ograniczenia indeksu columnstore: Tylko puste partycje mogą być podzielone, gdy w tabeli istnieje indeks columnstore. Przed wykonaniem tej operacji musisz usunąć lub wyłączyć indeks columnstore.

MERGE [ ZASIĘG ( boundary_value ]
Porzuca partycję i łączy wszystkie wartości znajdujące się w partycji z pozostałą partycją. RANGE (boundary_value) musi być istniejącą wartością brzegową partycji, którą ma zostać usunięta. Ten argument usuwa grupę plików, która pierwotnie zawierała boundary_value , ze schematu partycji, chyba że pozostała partycja ją używa lub oznacza własnością NEXT USED. Połączona partycja istnieje w grupie plików, która początkowo nie zawierała boundary_value . boundary_value jest wyrażeniem stałym, które może odwoływać się do zmiennych (w tym zmiennych typowych zdefiniowanych przez użytkownika) lub funkcji (w tym funkcji zdefiniowanych przez użytkownika). Nie może odnosić się do Transact-SQL wyrażenia. boundary_value musi albo dopasować, albo być niejawnie konwertowalna z typem danych odpowiadającej mu kolumny partycjonującej. Nie można też obciąć boundary_value podczas niejawnej konwersji w taki sposób, że rozmiar i skala wartości nie pokrywały się z odpowiadającą jej input_parameter_type.

Uwaga / Notatka

Ograniczenia indeksu columnstore: Nie można połączyć dwóch niepustych partycji zawierających indeks columnstore. Przed wykonaniem tej operacji będziesz musiał usunąć lub wyłączyć indeks columnstore

Najlepsze praktyki

Zawsze trzymaj puste partycje na obu końcach zakresu partycji. Zachowaj partycje na obu końcach, aby mieć pewność, że rozdzielenie partycji i scalanie partycji nie powodują żadnego ruchu danych. Podział partycji następuje na początku, a scalanie partycji następuje na końcu. Unikaj dzielenia lub łączenia partycji zaludnionych. Dzielenie lub łączenie partycji zaludnionych może być nieefektywne. Mogą być nieefektywne, ponieważ podział lub scalanie może powodować nawet czterokrotnie większą generację logów, a także poważne blokowanie.

Głównym powodem, dla którego umieszczasz partycje na wielu grupach plików, jest możliwość samodzielnego wykonywania operacji backupu i przywracania partycji. Dowiedz się więcej o grupach plików i strategiach partycjonowania w grupach plików .

Ograniczenia i ograniczenia

ALTER PARTITION FUNCTION repartycjonuje wszystkie tabele i indeksy, które wykorzystują tę funkcję w jednej operacji atomowej. Jednak operacja ta odbywa się offline i, w zależności od zakresu ponownego podziału, może być wymagająca zasobów.

Używaj tylko funkcji ALTER PARTITION do podziału jednej partycji na dwie lub łączenia dwóch partycji w jedną. Aby zmienić sposób podziału tabeli (na przykład z 10 partycji na pięć), należy wykonać dowolną z następujących opcji. W zależności od konfiguracji systemu, te opcje mogą się różnić pod względem zużycia zasobów:

  • Utwórz nową tabelę partycjonowaną z niezbędną funkcją partycjonowania. Następnie wstaw dane ze starej tabeli do nowej tabeli, używając INSERT INTO... SELECT FROM.

  • Utwórz podzielony indeks klastrowy na stercie.

    Uwaga / Notatka

    Usunięcie partycjonowanego indeksu klastrowanego powoduje partycjonowaną stertę.

  • Usuń i odbuduj istniejący podzielony indeks, używając Transact-SQL CREATE INDEX z klauzulą DROP EXISTENT = ON.

  • Uruchom sekwencję instrukcji ALTER PARTITION FUNCTION.

Wszystkie grupy plików, których dotyczy funkcja ALTER PARTITION, muszą być w trybie online.

FUNKCJA ZMIANA PARTYCJI zawodzi, gdy wyłączony klastrowany indeks istnieje na tabelach korzystających z funkcji partycji.

Silnik bazy danych nie zapewnia wsparcia replikacji dla modyfikacji funkcji partycji. Zmiany w funkcji partycji w bazie publikacji muszą być ręcznie wprowadzane w bazie subskrypcyjnej.

Permissions

Jedną z następujących uprawnień można użyć do wykonania funkcji ALTER PARTITION:

  • ZMIENIANIE UPRAWNIEŃ DO PRZESTRZENI DANYCH To uprawnienie domyślnie dotyczy członków stałej roli serwera sysadmin oraz stałych ról bazy danych db_owner i db_ddladmin.

  • UPRAWNIENIE CONTROL lub ALTER w bazie danych, w której utworzono funkcję partycji.

  • CONTROL SERVER lub ALTER ANY DATABASE uprawnienie na serwerze bazy danych, w której utworzono funkcję partycji.

Przykłady

A. Podziel partycję tabeli lub indeksu podzielonej na dwie partycje

Poniższy przykład tworzy funkcję partycji, aby podzielić tabelę lub indeks na cztery partycje. ALTER PARTITION FUNCTION dzieli jedną z partycji na dwie, tworząc łącznie pięć partycji.

IF EXISTS (SELECT * FROM sys.partition_functions  
    WHERE name = 'myRangePF1')  
DROP PARTITION FUNCTION myRangePF1;  
GO  
CREATE PARTITION FUNCTION myRangePF1 (int)  
AS RANGE LEFT FOR VALUES ( 1, 100, 1000 );  
GO  
--Split the partition between boundary_values 100 and 1000  
--to create two partitions between boundary_values 100 and 500  
--and between boundary_values 500 and 1000.  
ALTER PARTITION FUNCTION myRangePF1 ()  
SPLIT RANGE (500);  

B. Połącz dwie partycje tabeli podzielonej w jedną

Poniższy przykład tworzy tę samą funkcję partycji co powyżej, a następnie łączy dwie partycje w jedną partycję, dając łącznie trzy partycje.

IF EXISTS (SELECT * FROM sys.partition_functions  
    WHERE name = 'myRangePF1')  
DROP PARTITION FUNCTION myRangePF1;  
GO  
CREATE PARTITION FUNCTION myRangePF1 (int)  
AS RANGE LEFT FOR VALUES ( 1, 100, 1000 );  
GO  
--Merge the partitions between boundary_values 1 and 100  
--and between boundary_values 100 and 1000 to create one partition  
--between boundary_values 1 and 1000.  
ALTER PARTITION FUNCTION myRangePF1 ()  
MERGE RANGE (100);  

Dalsze kroki

Dowiedz się więcej o partycjonowaniu tabel i powiązanych porozumieniach w następujących artykułach: