it-swarm.com.de

So partitionieren Sie eine vorhandene nicht partitionierte Tabelle

Ich habe eine vorhandene Tabelle mit Daten:

dbo.Test (col1,col2,col3....) ON [PRIMARY]

Ich muss diese Tabelle so ändern, dass sie wie folgt partitioniert wird:

dbo.Test(col1,col2,col3....) ON Ps_Date(Col2)

Wie kann ich dies erreichen, ohne die Tabelle fallen zu lassen und neu zu erstellen?

22
343

Um eine Tabelle zu partitionieren, können Sie die folgenden kurzen Schritte ausführen:

  • erstellen Sie zuerst ein Partitionsfunktion und Partitionsschema
  • Danach können Sie eine Tabelle partitionieren.
  • Wenn Ihre Tabelle einen Clustered-Index hat, müssen Sie ihn auf der richtigen Partition ablegen und neu erstellen, oder Sie können die Klausel DROP_EXISTING Verwenden, um den Clustered-Index neu zu erstellen.
  • Wenn Ihre Tabelle keinen Clustered-Index hat, können Sie einfach einen auf der richtigen Partition mithilfe des Partitionsschemas erstellen.
  • Außerdem bietet Enterprise Edition die Flexibilität, die Option ONLINE=ON Der Anweisung CREATE INDEX zu verwenden, um Ausfallzeiten für Ihre Anwendung zu minimieren. Beachten Sie, dass beim Wiederherstellen des Index mithilfe der Option ONLINE eine Leistungsverschlechterung auftritt.

Um die Partitionierung zu automatisieren, können Sie SQL Server Partition Management-Dienstprogramm oder SQL Server Partitioned Table Framework verwenden auch auf Codeplex verfügbar.

Einige gute Ressourcen:

23
Kin Shah

Sie geben nicht an, ob Ihre Tabelle einen Clustered-Index hat oder nicht. Lassen Sie uns daher alle Optionen durchgehen.

Ich werde dieses Beispiel Partitionsfunktion, Partitionsschema und Tabelle verwenden:

CREATE PARTITION FUNCTION pf1(INT) AS RANGE LEFT FOR VALUES(10,20,30,40);
GO
CREATE PARTITION SCHEME ps1 AS PARTITION pf1 ALL TO ([PRIMARY])
GO
CREATE TABLE dbo.pt(pc INT NOT NULL, id INT NOT NULL) ON [PRIMARY];
GO

1. Ihre Tabelle hat einen Clustered-Index, der nicht durch eine Einschränkung erstellt wurde.

Dies ist der einfachste Fall. Sie können einfach die Anweisung CREATE INDEX Mit der Klausel DROP_EXISTING Verwenden, um die Tabelle in das Partitionsschema zu verschieben.

Angenommen, für diesen Beispiel wurde dieser Clustered-Index erstellt:

CREATE UNIQUE CLUSTERED INDEX ptc ON dbo.pt(Id) ON [PRIMARY];

Um diese Tabelle zu partitionieren, enthält der Clustered-Index die Partitionsspalte (in unserem Fall pt) als Teil des Schlüssels. Diese Anweisung ändert den Clustered-Index so, dass er die Partitionsspalte enthält und gleichzeitig partitioniert:

CREATE UNIQUE CLUSTERED INDEX ptc ON dbo.pt(pc, Id) WITH(DROP_EXISTING = ON)ON ps1(pc) ;

Die Klausel DROP_Existing Entfernt automatisch den vorhandenen Index, bevor der neue erstellt wird. Dies wird einem separaten DROP INDEX Vorgezogen, da dadurch die nicht gruppierten Indizes nur einmal neu erstellt werden.

2. Ihre Tabelle hat einen Clustered-Index, der Teil einer PRIMARY KEY - oder UNIQUE -Einschränkung ist und die Partitionsspalte als Teil des Schlüssels enthält.

Dieser ist immer noch einfach und dem vorherigen sehr ähnlich.

Angenommen, diese PRIMARY KEY - Einschränkung wurde für die Tabelle erstellt:

ALTER TABLE dbo.pt ADD CONSTRAINT ptc PRIMARY KEY CLUSTERED (pc, Id) ON [PRIMARY];

Jetzt können Sie einfach dasselbe Skript zur Neuerstellung ausführen, das wir in 1 verwendet haben:

CREATE UNIQUE CLUSTERED INDEX ptc ON dbo.pt(pc, Id) WITH(DROP_EXISTING = ON)ON ps1(pc) ;

. Die Tabelle hat einen Clustered-Index, der die Partitionsspalte nicht enthält, aber als Teil einer PRIMARY KEY - oder UNIQUE -Einschränkung erstellt wurde.

Pech. Sie können die Definition einer PRIMARY KEY - oder UNIQUE -Einschränkung nicht nachträglich ändern. Sie können die Einschränkung nur löschen und dann entweder einschließlich der Partitionsspalte neu erstellen oder einen Clustered-Index unabhängig von der Einschränkung erstellen, die die Partitionsspalte enthält. Im zweiten Fall können Sie die Einschränkung NONCLUSTERED neu erstellen, ohne die Partitionsspalte einzuschließen. Da diese Einschränkung jetzt nicht ausgerichtet ist (dh der unterstützende Index ist nicht partitioniert), müssen Sie angeben, wo sie auf der Festplatte abgelegt werden soll.

Angenommen, die Tabelle hatte einen Primärschlüssel wie diesen:

ALTER TABLE dbo.pt ADD CONSTRAINT ptc PRIMARY KEY CLUSTERED (Id) ON [PRIMARY];

Um diese Tabelle zu partitionieren, müssen Sie zuerst die Einschränkung löschen:

ALTER TABLE dbo.pt DROP CONSTRAINT ptc;

Dann müssen Sie den partitionierten Clustered-Index erstellen:

CREATE UNIQUE CLUSTERED INDEX ptci ON dbo.pt(pc, Id) ON ps1(pc) ;

Wenn Sie die nicht ausgerichtete Einschränkung PRIMARY KEY Neu erstellen möchten, können Sie dies folgendermaßen tun:

ALTER TABLE dbo.pt ADD CONSTRAINT ptc PRIMARY KEY NONCLUSTERED (Id) ON [PRIMARY];

4. Ihre Tabelle hat keinen Clustered-Index

In diesem Fall wird in den meisten Fällen empfohlen, nur einen Clustered-Index zu erstellen, um die Partitionierung einzurichten. Sie können die zuvor gesehene Anweisung zum Erstellen eines Index dafür verwenden:

CREATE UNIQUE CLUSTERED INDEX ptci ON dbo.pt(pc, Id) ON ps1(pc) ;

Wenn Sie jedoch einen guten Grund haben, keinen Clustered-Index zu erstellen, können Sie mit dem folgenden zweistufigen Ansatz davonkommen. Leider gibt es keinen direkten Weg, um diese Änderung vorzunehmen.

Angenommen, Ihre Tabelle hat keinen Clustered-Index. Um die Tabelle zu partitionieren, müssen Sie zuerst eine CLUSTERED UNIQUE - Einschränkung erstellen. (Sie können auch eine CLUSTERED PRIMARY KEY - Einschränkung verwenden.) Wenn Sie eine eindeutige Spaltenkombination haben, ist dies ein einfacher Schritt:

ALTER TABLE dbo.pt ADD CONSTRAINT ptc UNIQUE CLUSTERED(pc,id);

Nachdem die Einschränkung erstellt wurde, können Sie sie erneut löschen und gleichzeitig die Tabelle in das neue Partitionsschema "verschieben":

ALTER TABLE dbo.pt DROP CONSTRAINT ptc WITH(MOVE TO ps1(pc));

Wenn Sie keine eindeutige Spaltenkombination haben, haben Sie kein Glück. In diesem Fall können Sie nur eine neue Spalte hinzufügen und diese mit eindeutigen Werten füllen. Wenn der Tisch einigermaßen klein ist, können Sie Folgendes tun:

ALTER TABLE dbo.pt ADD tmp_id INT IDENTITY(1,1);

Dies erfordert jedoch eine exklusive Tabellensperre, bis alle Zeilen bewertet sind. Abhängig von der Tischgröße kann dies eine Weile dauern. Nachdem diese Spalte erstellt wurde, führen Sie die beiden oben genannten Schritte aus, um zuerst die Einschränkung UNIQUE zu erstellen und sie dann sofort wieder zu löschen. Anschließend können Sie die Spalte auch wieder löschen. Alle diese Schritte sind ziemlich aufdringlich, daher ist es wahrscheinlich besser, nur einen Clustered-Index für die Tabelle zu erstellen. Das muss nicht einmal einzigartig sein.


Wenn Sie über Enterprise Edition verfügen, können Sie die Klausel WITH(ONLINE=ON) für die meisten der obigen Anweisungen verwenden. Dadurch bleibt Ihre Tabelle für andere Verbindungen verfügbar. Während dieser Zeit wird es jedoch zu Leistungseinbußen kommen.

53
Sebastian Meine