Effizientes Übertragen von Daten durch Partitionswechsel

Aktualisiert: 12. Dezember 2006

Sie können die Transact-SQL ALTER TABLE...SWITCH-Anweisung zum schnellen und effizienten Übertragen von Datenblöcken folgendermaßen verwenden:

  • Zuweisen einer Tabelle als Partition zu einer bereits vorhandenen partitionierten Tabelle.
  • Verschieben einer Partition aus einer partitionierten Tabelle in eine andere.
  • Neuzuweisen einer Partition, um eine einzelne Tabelle zu erstellen.

Informationen zu Konzepten von Partitionswechseln finden Sie unter Entwerfen von Partitionen zum Verwalten von Datenteilmengen. Informationen zum Beispielcode, der Partitionswechsel implementiert, finden Sie unter Readme_SlidingWindow.

Allgemeine Anforderungen für das Wechseln von Partitionen

Wenn eine Partition übertragen wird, werden die Daten nicht physikalisch verschoben. Sie ändern nur die Metadaten, die angeben, wo die Daten gespeichert sind. Dies bedeutet, dass sowohl die Tabelle, aus der die Partition verschoben wird (die Quelltabelle), als auch die Tabelle, die die Partition erhält (die Zieltabelle), in der Datenbank vorhanden sein müssen, bevor Sie den SWITCH-Vorgang ausführen.

Wenn Sie eine Tabelle als Partition einer bereits vorhandenen partitionierten Tabelle hinzufügen oder eine Partition aus einer partitionierten Tabelle in eine andere verschieben, muss die empfangende Partition vorhanden und leer sein.

Wenn Sie eine Partition neu zuweisen, um eine nicht partitionierte Tabelle zu erstellen, muss die Tabelle, die die Partition erhält, bereits erstellt worden und leer sein.

Wenn Sie eine Partition aus einer partitionierten Tabelle in eine andere verschieben, müssen beide Tabellen für die gleiche Spalte partitioniert sein.

Die Quelle und das Ziel der ALTER TABLE...SWITCH-Anweisung müssen sich in der gleichen Dateigruppe befinden, und ihre Spalten mit umfangreichen Werten müssen in der gleichen Dateigruppe gespeichert sein. Alle zugehörigen Indizes oder Indexpartitionen müssen ebenfalls in der gleichen Dateigruppe gespeichert sein. Die Dateigruppe darf sich jedoch von der Dateigruppe der zugehörigen Tabellen oder zugehörigen Indizes unterscheiden.

Anforderungen an die Tabellen- und Indexstruktur

Die Quell- und die Zieltabelle müssen die gleiche Struktur aufweisen. Dies bedeutet Folgendes:

  • Sie müssen die gleichen Spalten mit den gleichen Namen und den folgenden gleichen Elementen aufweisen: Datentyp, Länge, Sortierung, Genauigkeit, Dezimalstellen, NULL-Zulässigkeit und Primärschlüsseleinschränkungen. Außerdem müssen sie die gleichen Einstellungen für ANSI_NULLS und QUOTED IDENTIFIER aufweisen. Zudem müssen die Spalten in derselben Reihenfolge definiert sein. Die IDENTITY-Eigenschaft wird nicht berücksichtigt.
    ms191160.Caution(de-de,SQL.90).gifVorsicht:
    Das Ausführen eines Partitionswechsels kann dazu führen, dass in IDENTITY-Spalten der Zieltabelle Werte doppelt auftreten und Lücken in den Werten von IDENTITY-Spalten in der Quelltabelle entstehen. Verwenden Sie DBCC CHECKIDENT, um die Identitätswerte der Tabellen zu überprüfen, und korrigieren Sie die Werte bei Bedarf.
  • Die NULL-Zulässigkeit ihrer Partitionierungsspalten muss übereinstimmen. Dies bedeutet, dass beide Spalten NULL oder NOT NULL sein müssen. Wenn eine der Tabellen nicht partitioniert ist, muss die NULL-Zulässigkeit der Spalte, die der Partitionierungsspalte der anderen Tabelle entspricht, mit der Partitionierungsspalte der anderen Tabelle übereinstimmen.
    ms191160.note(de-de,SQL.90).gifWichtig:
    Es wird empfohlen, NOT NULL für die Partitionierungsspalte von partitionierten Tabellen sowie von nicht partitionierten Tabellen anzugeben, die als Quelle oder Ziel für ALTER TABLE...SWITCH-Vorgänge fungieren. Damit stellen Sie sicher, dass mit CHECK-Einschränkungen für Partitionierungsspalten keine Überprüfung auf NULL-Werte ausgeführt werden muss. NULL-Werte werden gewöhnlich in der äußersten linken Partition einer partitionierten Tabelle platziert. Wenn Sie eine andere Partition als die äußerste linke Partition wechseln und wenn die ANSI_NULLS-Datenbankoption auf ON festgelegt ist, werden durch das Fehlen einer NOT NULL-Einschränkung in der Quell- und Zieltabelle möglicherweise CHECK-Einschränkungen beeinflusst, die auch für die Partitionierungsspalte definiert sind.
  • Wenn es sich bei den entsprechenden Partitionsschlüsseln um berechnete Spalten handelt, ist die Syntax von Ausdrücken gleich, die die berechneten Spalten definieren, und beide berechneten Spalten sind permanent.
  • Alle Spalten, die mit der ROWGUID-Eigenschaft definiert wurden, müssen einer Spalte in der anderen Tabelle entsprechen, die ebenfalls mit der ROWGUID-Eigenschaft definiert wurde.
  • Alle xml-Spalten müssen für die gleiche XML-Schemaauflistung typisiert sein.
  • Die Einstellungen für Daten in Zeilen aller text-, ntext- oder image-Spalten sind gleich. Weitere Informationen zu dieser Einstellung finden Sie unter Daten in Zeilen.
  • Die Tabellen weisen die gleichen gruppierten Indizes auf. Diese Indizes können nicht deaktiviert werden.
  • Alle nicht gruppierten Indizes, die für die Zieltabelle definiert werden, sind auch für die Quelltabelle definiert und weisen eine identische Struktur hinsichtlich der Eindeutigkeit, den Unterschlüsseln und der Sortierrichtung (ASC oder DESC) für jede Indexschlüsselspalte auf. Nicht gruppierte Indizes, die deaktiviert sind, unterliegen dieser Anforderung nicht.

Einschränkungsanforderungen

Alle CHECK-Einschränkungen, die für die Zieltabelle definiert werden, werden auch für die Quelltabelle als genaue Übereinstimmung oder als der CHECK-Einschränkung der Zieltabelle unterliegend definiert.

Wenn die Zieltabelle z. B. eine Einschränkung für eine int-Spalte Column1 aufweist, die Column1 < 100 angibt, muss die entsprechende Column1-Spalte der Quelltabelle entweder die gleiche Einschränkung oder eine Einschränkung aufweisen, deren Werte eine Untermenge der Einschränkung der Zieltabelle sind, z. B. Column1 < 90. CHECK-Einschränkungen, die mehrere Spalten angeben, müssen mithilfe der gleichen Syntax definiert werden.

Wenn Sie einer bereits vorhandenen partitionierten Tabelle eine nicht partitionierte Tabelle als Partition hinzufügen, muss eine Einschränkung für die Spalte der Quelltabelle definiert werden, die dem Partitionsschlüssel der Zieltabelle entspricht. Auf diese Weise wird sichergestellt, dass der Bereich der Werte in die Begrenzungswerte der Zielpartition passt.

Wenn Sie eine Partition einer partitionierten Tabelle in eine andere partitionierte Tabelle verschieben, müssen die Begrenzungswerte der Quellpartition in die Begrenzungswerte der Zielpartition passen. Wenn die Begrenzungswerte nicht passen, muss eine Einschränkung für den Partitionsschlüssel der Quelltabelle definiert werden, damit gewährleistet ist, dass sämtliche Daten in der Tabelle in die Begrenzungswerte der Zielpartition passen.

ms191160.Caution(de-de,SQL.90).gifVorsicht:
Vermeiden Sie Datentypkonvertierung in Einschränkungsdefinitionen. Einschränkungen, die implizite oder explizite Datentypkonvertierung einschließen und für Tabellen definiert werden, die Quellen für Partitionswechsel sind, können bewirken, dass ALTER TABLE...SWITCH einen Fehler erzeugt.

Wenn die Zieltabelle FOREIGN KEY-Einschränkungen besitzt, müssen für die Quelltabelle die gleichen Fremdschlüssel für die entsprechenden Spalten definiert sein, und diese Fremdschlüssel müssen auf den gleichen Primärschlüssel wie die Fremdschlüssel der Zieltabelle verweisen. Die Fremdschlüssel der Quelltabelle können nur dann als is_not_trusted (diese Einstellung kann in der sys.foreign_keys-Katalogsicht angezeigt werden) markiert werden, wenn auch der entsprechende Fremdschlüssel der Zieltabelle als is_not_trusted markiert wird. Weitere Informationen zu dieser Einstellung finden Sie unter Richtlinien zum Deaktivieren von Indizes. Alle CASCADE-Regeln, die für die Fremdschlüssel der Zieltabelle definiert wurden, werden von SQL Server auf die neu verschobene Partition angewendet.

Weitere Anforderungen für das Verschieben von Partitionen

Die folgenden zusätzlichen Anforderungen müssen beim Verschieben von Partitionen ebenfalls berücksichtigt werden:

  • Alle Indizes für die Quell- oder die Zieltabelle müssen unabhängig davon, ob die Quelltabelle oder die Zieltabelle partitioniert ist oder beide Tabellen partitioniert sind, an der Tabelle ausgerichtet sein.
  • Es dürfen keine Volltextindizes für die Quell- oder die Zieltabelle vorhanden sein.
  • Es dürfen keine XML-Indizes in der Zieltabelle vorhanden sein.
  • Es darf keine aktive Primärschlüssel-/Fremdschlüsselbeziehung zwischen der Quelltabelle und der Zieltabelle vorhanden sein, bei der die Quelltabelle den Primärschlüssel enthält.
  • Es darf keine aktive Primärschlüssel-/Fremdschlüsselbeziehung zwischen der Quelltabelle und der Zieltabelle vorhanden sein, bei der die Zieltabelle den Fremdschlüssel enthält.
  • Auf die Quelltabelle darf nicht durch einen Fremdschlüssel in einer anderen Tabelle verwiesen werden.
  • Die Quelltabelle und die Zieltabelle können nicht in einer Sicht mit Schemabindung enthalten sein. Aus diesem Grund können für sie keine indizierten Sichten definiert werden.
  • Es dürfen keine Regeln für die Quell- oder die Zieltabelle definiert sein.
    ms191160.note(de-de,SQL.90).gifHinweis:
    Regeln sind ein Feature, das aus Gründen der Abwärtskompatibilität bereitgestellt wird. Die bevorzugte Implementierung erfolgt mithilfe von CHECK-Einschränkungen. Weitere Informationen zu den Einschränkungen hinsichtlich CHECK-Einschränkungen finden Sie unter Einschränkungsanforderungen weiter oben in diesem Thema.
  • Weder die Quell- noch die Zieltabelle darf eine Quelle für die Replikation sein.
  • Für einen Partitionswechsel ist die Ausführung einer ALTER TABLE-Anweisung erforderlich. Sie müssen daher über die erforderlichen Datenbankberechtigungen verfügen, die die ALTER TABLE-Anweisung verlangt. Der Berechtigungssatz muss für die Quell- und die Zieltabelle nicht übereinstimmen.

Durch das Verschieben von Tabellenpartitionen werden keine INSERT-, UPDATE- oder DELETE-Trigger sowie kaskadierenden Aktionen aktiviert, und es ist nicht erforderlich, dass für die Quell- und Zieltabellen ähnlich definierte Trigger vorhanden sind, damit Partitionen verschoben werden können.

ms191160.note(de-de,SQL.90).gifHinweis:
Durch das Ausführen eines ALTER TABLE…SWITCH-Vorgangs wird eine Sperre des Typs Sch-M (Schemaänderung) für die Quell- und die Zieltabellen abgerufen, um sicherzustellen, dass keine anderen Verbindungen während der Änderung auch nur auf die Metadaten der Tabelle verweisen. Weitere Informationen zu Sperren finden Sie unter Sperrmodi.

So verschieben Sie Tabellenpartitionen

Siehe auch

Konzepte

Entwerfen von Partitionen zum Verwalten von Datenteilmengen

Andere Ressourcen

DBCC CHECKIDENT (Transact-SQL)
ALTER PARTITION FUNCTION (Transact-SQL)
ALTER PARTITION SCHEME (Transact-SQL)
Readme_SlidingWindow

Hilfe und Informationen

Informationsquellen für SQL Server 2005

Änderungsverlauf

Version Verlauf

12. Dezember 2006

Neuer Inhalt:

Es wurde ein Hinweis hinzugefügt, in dem empfohlen wird, NOT NULL für die Partitionierungsspalte von partitionierten Tabellen sowie von nicht partitionierten Tabellen anzugeben, die als Quelle oder Ziel für ALTER TABLE...SWITCH-Vorgänge fungieren.

14. April 2006

Geänderter Inhalt:
  • XML-Indizes, die in der Quelltabelle definiert wurden, haben keine Auswirkung auf den Partitionswechsel. Es dürfen keine XML-Indizes in der Zieltabelle sein, um Partitionswechsel auszuführen.