Ich würde denken, dass dies eine ziemlich einfache Frage wäre, aber ich hatte tatsächlich Schwierigkeiten, eine Antwort darauf zu finden.
Die Frage: Können Sie Datenzeilen innerhalb einer partitionierten Tabelle von einer Partition in eine andere verschieben, indem Sie einfach die Partitionsspalte so aktualisieren, dass sie die Partitionsgrenze überschreitet?
Wenn ich zum Beispiel eine Tabelle mit einem Partitionsschlüssel habe:
CREATE TABLE SampleTable
(
SampleID INT PRIMARY KEY,
SampleResults VARCHAR(100) NOT NULL,
)
Mit der Partitionsfunktion, die dem Primärschlüssel zugeordnet ist:
CREATE PARTITION FUNCTION MyPartitionFunc (INT) AS
RANGE LEFT FOR VALUES (10000, 20000);
Kann ich eine Zeile von der ersten Partition auf die dritte Partition verschieben, indem ich die SampleID von 1 auf (sagen wir) 500.000 ändere?
Hinweis: Ich bezeichne dies als SQL Server 2005 und 2008, da beide die Partitionierung unterstützen. Gehen sie anders damit um?
$PARTITION
berechnet nur die Partitionsnummer basierend auf der Eingabe; Es wird nicht überprüft, wo die Zeile physisch lebt.Um dies zu testen, muss das Experiment die Tabelle tatsächlich partitionieren. Siehe http://www.kodyaz.com/articles/how-to-partition-table-non-partitioned-table-sql-server-2008.aspx
Wenn Sie die Partitionierungsfunktion abfragen, erfahren Sie nur, was die Partitionierungsfunktion sagt. Es sagt nicht, wo die Daten gespeichert sind. Sie können eine Partitionierungsfunktion einrichten und ausführen, ohne eine Tabelle zu partitionieren, wie hier bereits gezeigt wurde.
Um die Tabelle zu partitionieren, müssen Sie auch Dateigruppen und ein Partitionierungsschema erstellen, das die Partitionierungsfunktion verwendet, um Funktionsergebnisse Dateigruppen zuzuweisen. Dann müssen Sie einen gruppierten Schlüssel in die Tabelle einfügen, der dieses Partitionsschema verwendet.
Richten Sie die Partitionierung ein
Ich bin kein Experte für Befehlszeilen-SQL. Ich habe die SSMS-Schnittstelle verwendet, um die Dateigruppen pfg1 (mit einer pf1-Datei) und pfg2 (mit einer pf2-Datei) einzurichten. Dann habe ich die Partitionierungsfunktion und das Schema deklariert:
Erstellen Sie die Tabelle und den Clustered-Index
Wenn Sie danach sys.partitions abfragen (ich habe 2005), sehen Sie, dass die Tabelle jetzt zwei Partitionen anstelle nur einer für die Tabelle enthält. Dies zeigt an, dass die Partitionierung für diese Tabelle vollständig implementiert wurde.
Nun, da wir zwei Partitionen haben (mit einer Zeilenanzahl für jede), können wir ein Experiment durchführen.
Fügen Sie die Zeilen ein
Überprüfen Sie die sys.partitions, um zu sehen, was passiert ist.
Ja. Eine Zeile in jeder Partition.
Eine Reihe verschieben.
Überprüfen Sie die Partitionen
Die erste Partition hat jetzt zwei Zeilen anstelle von 1 und die zweite Partition hat null Zeilen anstelle von zwei.
Ich denke, dies bestätigt, dass die Zeile automatisch aufgrund der Änderung des gruppierten Schlüssels in einer partitionierten Tabelle verschoben wurde.
quelle
Ich denke nicht, dass diese Antwort richtig ist. Wenn Sie den Wert verwenden
Sie berechnen einfach neu, was die Partition sein soll, und nicht, wo sich der Datensatz gerade befindet.
Du solltest benutzen:
In meinen Tests auf SQL 2005 ändert sich der Wert, aber der Datensatz bleibt auf derselben Partition. Dies führt wahrscheinlich zu Problemen mit den Statistiken und dem Optimierer, da dieser in einem Multithread-Modus ausgeführt wird und erwartet, dass sich eine Partition in einem bestimmten Bereich befindet. Es ist auch völlig falsch, wenn versucht wird, die Partitionseliminierung zu verwenden, um nur die relevante Partition abzufragen. Ich denke, Sie müssen jeden Datensatz löschen und neu einfügen, damit er verschoben wird.
quelle
$partition
Sie hier nach suchen, ist die akzeptierte Antwort richtig. Wie bestätigen Sie, dass sich der Datensatz nach der Aktualisierung in derselben Partition befindet?