Verwenden partitionierter Sichten

Mithilfe von partitionierten Sichten können die Daten einer umfangreichen Tabelle in kleinere Elementtabellen aufgeteilt werden. Die Daten werden anhand von Datenwertbereichen in einer der Spalten auf die Elementtabellen aufgeteilt. Die Datenbereiche für die Elementtabellen werden in einer CHECK-Einschränkung definiert, die für die Partitionsspalte angegeben wird. Anschließend wird eine Sicht definiert, die UNION ALL verwendet, um Auswahlergebnisse aller Elementtabellen in einem einzelnen Resultset zu kombinieren. Wenn SELECT-Anweisungen, die auf die Sicht verweisen, eine Suchbedingung für die Partitionsspalte angeben, verwendet der Abfrageoptimierer die Definitionen der CHECK-Einschränkungen, um zu ermitteln, in welcher Elementtabelle die Zeilen enthalten sind.

HinweisHinweis

Die bevorzugte Methode zum Partitionieren von lokalen Daten auf einem Server besteht in der Verwendung partitionierter Tabellen. Weitere Informationen finden Sie unter Partitionierte Tabellen und Indizes.

Für das folgende Beispiel wird angenommen, dass eine Verkaufstabelle mit dem Umsatz für das Jahr 1998 in 12 Elementtabellen (eine pro Monat) partitioniert wurde. Jede Elementtabelle verfügt über eine Einschränkung, die für die OrderMonth-Spalte definiert ist:

CREATE TABLE May1998sales
   (OrderID      INT,
   CustomerID      INT      NOT NULL,
   OrderDate      DATETIME      NULL
      CHECK (DATEPART(yy, OrderDate) = 1998),
   OrderMonth      INT
      CHECK (OrderMonth = 5),
   DeliveryDate      DATETIME      NULL
      CHECK(DATEPART(mm, DeliveryDate) = 5)
   CONSTRAINT OrderIDMonth PRIMARY KEY(OrderID, OrderMonth)
   )

Die Anwendung, die May1998sales ausfüllt, muss sicherstellen, dass alle Zeilen in der OrderMonth-Spalte den Wert 5 enthalten und dass das Bestelldatum ein Datum im Mai 1998 angibt. Dies wird durch die Einschränkungen, die für die Tabelle definiert sind, erzwungen.

Anschließend wird eine Sicht definiert, die UNION ALL verwendet, um die Daten aus allen 12 Elementtabellen auszuwählen und in einem einzelnen Resultset zu kombinieren.

CREATE VIEW Year1998Sales
AS
SELECT * FROM Jan1998Sales
UNION ALL
SELECT * FROM Feb1998Sales
UNION ALL
SELECT * FROM Mar1998Sales
UNION ALL
SELECT * FROM Apr1998Sales
UNION ALL
SELECT * FROM May1998Sales
UNION ALL
SELECT * FROM Jun1998Sales
UNION ALL
SELECT * FROM Jul1998Sales
UNION ALL
SELECT * FROM Aug1998Sales
UNION ALL
SELECT * FROM Sep1998Sales
UNION ALL
SELECT * FROM Oct1998Sales
UNION ALL
SELECT * FROM Nov1998Sales
UNION ALL
SELECT * FROM Dec1998Sales

So werden z. B. durch die folgende SELECT-Anweisung Informationen zu bestimmten Monaten abgefragt.

SELECT *
FROM Year1998Sales
WHERE OrderMonth IN (5,6) AND CustomerID = 64892

Der SQL Server-Abfrageoptimierer erkennt, dass die Suchbedingung in dieser SELECT-Anweisung ausschließlich auf Zeilen in den Tabellen May1998Sales und Jun1998Sales verweist. Er begrenzt die Suche daher auf diese Tabellen.

Die Partitionierungsspalte muss Teil des Primärschlüssels der Basistabelle sein, damit Aktualisierungen für eine partitionierte Sicht durchgeführt werden können. Wenn eine Sicht nicht aktualisierbar ist, können Sie einen INSTEAD OF-Trigger für die Sicht erstellen, die Aktualisierungen zulässt. Sie sollten Fehlerbehandlung in den Trigger integrieren, damit sichergestellt wird, dass keine doppelten Zeilen eingefügt werden. Ein Beispiel für einen in eine Sicht integrierten INSTEAD OF-Trigger finden Sie unter Entwerfen von INSTEAD OF-Triggern.

CHECK-Einschränkungen sind nicht erforderlich, damit die partitionierte Sicht richtige Ergebnisse zurückgibt. Wurden jedoch keine CHECK-Einschränkungen definiert, muss der Abfrageoptimierer alle Tabellen durchsuchen und nicht nur solche, die der Suchbedingung für die Partitionsspalte entsprechen. Ohne die CHECK-Einschränkungen wird die Sicht wie jede andere Sicht mit UNION ALL behandelt. Der Abfrageoptimierer kann Informationen zu Werten, die in verschiedenen Tabellen gespeichert sind, nicht nutzen, und er kann Tabellen, die Teil der Sichtdefinition sind, nicht auslassen.

Wenn sich alle Elementtabellen, auf die von einer partitionierten Sicht verwiesen wird, auf demselben Server befinden, handelt es sich um eine lokale partitionierte Sicht. Wenn sich die Elementtabellen über mehrere Server erstrecken, ist die Sicht eine verteilte partitionierte Sicht. Verteilte partitionierte Sichten können verwendet werden, um die Last der Datenbankverarbeitung eines Systems auf eine Gruppe von Servern zu verteilen. Weitere Informationen finden Sie unter Vereinte Datenbankserver.

Partitionierte Sichten vereinfachen die unabhängige Verwaltung von Elementtabellen. So haben Sie z. B. am Ende einer bestimmten Zeitspanne folgende Möglichkeiten:

  • Die Definition der partitionierten Sicht für die aktuellen Ergebnisse kann geändert werden, um die jüngste Zeitspanne hinzuzufügen und die älteste zu löschen.

  • Die Definition der partitionierten Sicht für vergangene Ergebnisse kann geändert werden, um die soeben aus der Sicht der aktuellen Ergebnisse gelöschte Zeitspanne hinzuzufügen. Darüber hinaus kann die Sicht für vergangene Ergebnisse aktualisiert werden, um die älteste erfasste Zeitspanne zu entfernen und zu archivieren.

Wenn Sie Daten in partitionierte Sichten einfügen, können Sie mithilfe der gespeicherten Systemprozedur sp_executesql INSERT-Anweisungen mit Ausführungsplänen erstellen, die in Systemen mit zahlreichen gleichzeitigen Benutzern mit hoher Wahrscheinlichkeit wieder verwendet werden.

HinweisHinweis

Der Massenimport in eine partitionierte Sicht wird vom Befehl bcpund von den Anweisungen BULK INSERT und INSERT ... SELECT * FROM OPENROWSET(BULK...) nicht unterstützt. Mithilfe einer INSERT-Anweisung können Sie jedoch mehrere Zeilen in eine partitionierte Sicht einfügen.