Partitionierung auf einer einzelnen Dateigruppe

10

Ich habe einige sehr große Tabellen in meiner Datenbank, aber ein wesentlicher Teil dieser Daten ist "alt".

Aufgrund von Umständen, die außerhalb meiner Kontrolle liegen, darf ich diese "alten" Daten nicht entfernen. Die andere Einschränkung besteht darin, dass ich die Datenbank nicht ändern kann, dh Dateigruppen hinzufügen kann. So wie die Dinge jetzt stehen, befindet sich alles in der PRIMARYDateigruppe.

Ich dachte daran, diese Tabellen in einige Partitionen zu unterteilen, wie "neu", "alt", "archiviert" und ähnliches. Ich habe eine "Status" -Spalte, die ich für diesen Zweck verwenden möchte.

Angesichts des beschriebenen Szenarios und der Einschränkungen habe ich mich gefragt, ob eine Partitionierung hier sinnvoll ist. Mit anderen Worten, wenn meine Tabelle auf diese Weise partitioniert ist, sich aber alle Partitionen in derselben Dateigruppe befinden, ist SQL Server intelligent genug, um den speziellen Bereich in der zugrunde liegenden Datei zu finden, in dem sich meine "neuen" Daten befinden, und berührt nicht die Bereich mit "alten" Daten?

Anders ausgedrückt, wenn beispielsweise 80% meiner Daten "alt" sind. Verfügt SQL Server über einen Mechanismus, um den Zugriff auf 100% der zugrunde liegenden Dateien zu vermeiden und nur auf 20% zuzugreifen, die "neue" Daten enthalten (vorausgesetzt natürlich, ich gebe meine Partitionierungsspalte in der WHEREKlausel der Abfragen an).

Ich denke, um dies zu beantworten, müsste man verstehen, wie die Partitionierung intern implementiert wird. Ich schätze alle Hinweise.

Paul White 9
quelle

Antworten:

6

Die Partitionierung einer Tabelle in derselben Dateigruppe bietet zwei Vorteile:

  1. Ermöglichen, dass Teile eines großen Index schrittweise neu erstellt werden, um eine effizientere Wartung zu ermöglichen. Überprüfen Sie die ALTER INDEX [foo] REBUILD PARTITION=nfür weitere Details.
  2. Nutzung der Eliminierung von Partitionen und (möglicherweise) Sperren auf Partitionsebene zur Verbesserung der Abfragewartung. Ich diskutiere das in meinem Blog .

Beim Partitionieren sind verschiedene Dinge zu beachten.

  • Wenn Ihre Tabelle einen gruppierten Index hat (und es sollte wirklich), Ihre Partitionierungsschlüssel muss Teil des Clustered - Index sein.
  • Um Leistungsprobleme zu vermeiden, sollten Sie Ihre Partitionen ausrichten. Dies bedeutet, dass alle Ihre Indizes Ihren Partitionsschlüssel enthalten sollten, sei es als Include oder als Teil des Index selbst.
  • Indexwiederherstellungen für Partitionen sind in aktuellen Versionen von SQL Server (2005-2012) offline. Wenn Ihre Partitionen zu groß sind und Sie nach Partitionen neu erstellen, kann dies zu Blockierungsproblemen führen.

Ich empfehle, vor der Implementierung gründliche Nachforschungen über die Partitionierung anzustellen. Kendra Little verfügt über eine hervorragende Liste von Ressourcen, mit denen Sie beginnen können.

Mike Fal
quelle
Wenn ich einen Clustered-Index partitioniert habe, enthalten nicht alle Nicht-Clustered-Indizes bereits die Partitionierungsspalte als Zeilenlokator?
Zikato
0

Die Antwort ist ja". Es gibt einen Mechanismus für jede Abfrage, der Eingaben basierend auf der Logik filtert, die zum Definieren der Partitionen verwendet wird.

Sie müssen jedoch über den entsprechenden Filter verfügen, sonst wird die gesamte Partition gescannt. Dies beinhaltet normalerweise Datumsfilter (in Ihrem Fall), um die Partition auszuwählen.

Eine Möglichkeit, dies zu erzwingen, besteht darin, Ansichten zu haben, die nur auf eine Partition zugreifen, mit der richtigen Logik in der Ansicht.

Gordon Linoff
quelle
Ich frage mich , wie viel der Performance - Gewinn für die Partitionierung auf den gleichen physischen Disc wäre ..
SOTN