ALTER PARTITION FUNCTION (Transact-SQL)

Ändert eine Partitionsfunktion durch Teilen oder Zusammenführen der Begrenzungswerte. Durch Ausführen von ALTER PARTITION FUNCTION kann eine Partition einer Tabelle oder eines Index, die bzw. der die Partitionsfunktion verwendet, in zwei Partitionen aufgeteilt werden, oder zwei Partitionen können zu einer einzigen Partition zusammengeführt werden.

VorsichtshinweisVorsicht

Mehrere Tabellen oder Indizes können dieselbe Partitionsfunktion verwenden. ALTER PARTITION FUNCTION wirkt sich auf alle Tabellen und Indizes in einer einzigen Transaktion aus.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

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

Argumente

  • partition_function_name
    Der Name der zu ändernden Partitionsfunktion.

  • SPLIT RANGE ( boundary_value )
    Fügt der Partitionsfunktion eine Partition hinzu. boundary_value bestimmt den Bereich der neuen Partition und muss von den vorhandenen Begrenzungsbereichen der Partitionsfunktion abweichen. Basierend auf boundary_value teilt Database Engine (Datenbankmodul) einen der vorhandenen Bereiche in zwei Bereiche auf. Der Bereich mit dem neuen boundary_value-Wert wird als die neue Partition betrachtet.

    Eine Dateigruppe muss online vorhanden sein und vom Partitionsschema, das die Partitionsfunktion verwendet, zum Speichern der neuen Partition als NEXT USED markiert werden. Dateigruppen werden in einer CREATE PARTITION SCHEME-Anweisung Partitionen zugeordnet. Falls eine CREATE PARTITION SCHEME-Anweisung mehr Dateigruppen als erforderlich zuordnet (in der CREATE PARTITION FUNCTION-Anweisung werden weniger Partitionen als Dateigruppen zum Speichern erstellt), sind nicht zugewiesene Dateigruppen vorhanden, und eine davon wird vom Partitionsschema als NEXT USED markiert. In dieser Dateigruppe wird die neue Partition gespeichert. Falls vom Partitionsschema keine Dateigruppen als NEXT USED markiert werden, müssen Sie mit ALTER PARTITION SCHEME eine Dateigruppe hinzufügen oder eine vorhandene Dateigruppe zum Speichern der neuen Partition festlegen. Für eine Dateigruppe, in der bereits Partitionen vorhanden sind, können zusätzliche Partitionen festgelegt werden. Eine Partitionsfunktion kann bei mehreren Partitionsschemas verwendet werden. Deshalb müssen alle Partitionsschemas, die die Partitionsfunktion verwenden, der Sie Partitionen hinzufügen, eine NEXT USED-Dateigruppe aufweisen. Andernfalls wird für ALTER PARTITION FUNCTION ein Fehler gemeldet, und es werden die Partitionsschemas angezeigt, für die eine NEXT USED-Dateigruppe fehlt.

    Wenn Sie alle Partitionen in derselben Dateigruppe erstellen, wird diese Dateigruppe anfänglich automatisch der NEXT USED-Dateigruppe zugewiesen. Nach der Ausführung eines Teilungsvorgangs gibt es jedoch keine festgelegte NEXT USED-Dateigruppe mehr. Sie müssen die Dateigruppe explizit mit ALTER PARITION SCHEME der NEXT USED-Dateigruppe zuweisen. Andernfalls schlägt ein nachfolgender Teilungsvorgang fehl.

  • MERGE [ RANGE ( boundary_value) ]
    Löscht eine Partition und führt Werte in der Partition mit einer der restlichen Partitionen zusammen. RANGE (boundary_value) muss ein vorhandener Begrenzungswert sein, mit dem die Werte aus der gelöschten Partition zusammengeführt werden. Die Dateigruppe, in der boundary_value ursprünglich vorhanden war, wird aus dem Partitionsschema entfernt, es sei denn, sie wird von einer restlichen Partition verwendet oder sie ist mit der NEXT USED-Eigenschaft markiert. Die zusammengeführte Partition befindet sich in der Dateigruppe, in der boundary_value ursprünglich nicht vorhanden war. boundary_value ist ein konstanter Ausdruck, mit dem auf Variablen (einschließlich benutzerdefinierter Variablen) oder Funktionen (einschließlich benutzerdefinierter Funktionen) verwiesen werden kann. Auf einen Transact-SQL-Ausdruck kann nicht verwiesen werden. boundary_value muss entweder mit dem Datentyp der entsprechenden Partitionierungsspalte übereinstimmen oder implizit in den Datentyp der entsprechenden Partitionierungsspalte konvertiert werden können. Während der impliziten Konvertierung kann der Wert nicht so abgeschnitten werden, dass die Größe und die Dezimalstellen dieses Werts und des entsprechenden input_parameter_type-Werts nicht übereinstimmen.

Bewährte Methoden

Behalten Sie leere Partitionen an beiden Enden des Partitionsbereichs immer bei, um sicherzustellen, dass die Partitionsaufteilung (vor dem Laden neuer Daten) und die Partitionszusammenführung (nach dem Entladen alter Daten) nicht zu einer Datenverschiebung führen. Vermeiden Sie das Aufteilen oder Zusammenführen aufgefüllter Partitionen. Dies kann extrem ineffizient sein, da es zu einer viermal so umfangreichen Protokollgenerierung und zudem zu schwerwiegenden Sperren führen kann.

Einschränkungen

ALTER PARTITION FUNCTION partitioniert Tabellen und Indizes neu, die die Funktion in einem einzelnen unteilbaren Vorgang verwenden. Dieser Vorgang erfolgt jedoch offline, und in Abhängigkeit vom Umfang kann die Neupartitionierung ressourcenintensiv sein.

ALTER PARTITION FUNCTION kann nur zum Teilen einer Partition in zwei Partitionen oder zum Zusammenführen von zwei Partitionen zu einer Partition verwendet werden. Um die Partitionierung einer Tabelle anderweitig zu ändern (z. B. von 10 Partitionen in 5 Partitionen), können Sie eine der folgenden Optionen ausführen. Der Ressourcenverbrauch dieser Optionen hängt von der Systemkonfiguration ab:

  • Erstellen Sie eine neue partitionierte Tabelle mit der gewünschten Partitionsfunktion, und fügen Sie dann mithilfe einer INSERT INTO...SELECT FROM-Anweisung die Daten aus der alten Tabelle in die neue Tabelle ein.

  • Erstellen Sie einen partitionierten gruppierten Index für einen Heap.

    HinweisHinweis

    Das Löschen eines partitionierten gruppierten Index ergibt einen partitionierten Heap.

  • Verwenden Sie die CREATE INDEX-Anweisung von Transact-SQL mit der DROP EXISTING = ON-Klausel, um einen vorhandenen partitionierten Index zu löschen und neu zu erstellen.

  • Führen Sie eine Abfolge von ALTER PARTITION FUNCTION-Anweisungen aus.

Alle von ALTER PARITITION FUNCTION betroffenen Dateigruppen müssen online sein.

Für ALTER PARTITION FUNCTION wird ein Fehler gemeldet, wenn ein deaktivierter gruppierter Index für Tabellen vorhanden ist, die die Partitionsfunktion verwenden.

SQL Server bietet keine Replikationsunterstützung zum Ändern einer Partitionsfunktion. Änderungen an einer Partitionsfunktion in der Veröffentlichungsdatenbank müssen in der Abonnementdatenbank manuell angewendet werden.

Berechtigungen

Die folgenden Berechtigungen können zum Ausführen von ALTER PARTITION FUNCTION verwendet werden:

  • ALTER ANY DATASPACE-Berechtigung. Diese Berechtigung gilt standardmäßig für Mitglieder der festen Serverrolle sysadmin und für Mitglieder der festen Datenbankrollen db_owner und db_ddladmin.

  • Die Berechtigung CONTROL oder ALTER für die Datenbank, in der die Partitionsfunktion erstellt wurde.

  • CONTROL SERVER- oder ALTER ANY DATABASE-Berechtigung für den Server der Datenbank, in der die Partitionsfunktion erstellt wurde.

Beispiele

A. Teilen der Partition einer partitionierten Tabelle oder eines partitionierten Index in zwei Partitionen

Im folgenden Beispiel wird eine Partitionsfunktion erstellt, um eine partitionierte Tabelle oder einen partitionierten Index in vier Partitionen zu unterteilen. Mit ALTER PARTITION FUNCTION wird eine der Partitionen in zwei Partitionen geteilt, um insgesamt fünf Partitionen zu erstellen.

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. Zusammenführen von zwei Partitionen einer partitionierten Tabelle zu einer einzigen Partition

Im folgenden Beispiel wird dieselbe Partitionsfunktion wie oben erstellt, und anschließend werden zwei Partitionen zu einer einzigen Partition zusammengeführt, sodass sich insgesamt drei Partitionen ergeben.

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);