Nie określasz, czy tabela ma indeks klastrowany, czy nie, więc przejrzyjmy wszystkie opcje.
Użyję tej przykładowej funkcji partycji, schematu partycji i tabeli:
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. Twoja tabela ma klastrowany indeks, który nie został utworzony przez ograniczenie.
To najłatwiejszy przypadek. Możesz po prostu użyć CREATE INDEX
instrukcji z DROP_EXISTING
klauzulą, aby przenieść tabelę do schematu partycji.
Załóżmy na przykład, że ten indeks klastrowy został utworzony:
CREATE UNIQUE CLUSTERED INDEX ptc ON dbo.pt(Id) ON [PRIMARY];
Aby podzielić tę tabelę, indeks klastrowany zawiera kolumnę partycji (w naszym przypadku pt) jako część klucza. Ta instrukcja zmienia indeks klastrowy, tak aby obejmował kolumnę partycji i dzieli ją na partycje w tym samym czasie:
CREATE UNIQUE CLUSTERED INDEX ptc ON dbo.pt(pc, Id) WITH(DROP_EXISTING = ON)ON ps1(pc) ;
DROP_Existing
Klauzula automatycznie usuwa istniejący indeks przed utworzeniem nowego. Jest to preferowane DROP INDEX
zamiast osobnego, ponieważ powoduje, że indeksy nieklastrowane są odbudowywane tylko raz.
2. Tabela ma indeks klastrowy będący częścią ograniczenia PRIMARY KEY
lub UNIQUE
zawierający kolumnę partycji jako część klucza
Ten jest wciąż łatwy i bardzo podobny do poprzedniego.
Załóżmy, że to PRIMARY KEY
ograniczenie zostało utworzone w tabeli:
ALTER TABLE dbo.pt ADD CONSTRAINT ptc PRIMARY KEY CLUSTERED (pc, Id) ON [PRIMARY];
Teraz możesz po prostu uruchomić ten sam skrypt ponownego tworzenia, którego użyliśmy w 1:
CREATE UNIQUE CLUSTERED INDEX ptc ON dbo.pt(pc, Id) WITH(DROP_EXISTING = ON)ON ps1(pc) ;
3. Tabela ma indeks klastrowy, który nie zawiera kolumny partycji, ale został utworzony jako część ograniczenia PRIMARY KEY
lubUNIQUE
Pech. Po fakcie nie można zmienić definicji ograniczenia PRIMARY KEY
ani UNIQUE
ograniczenia. Jedyną opcją jest usunięcie ograniczenia, a następnie albo odtworzenie go, łącznie z kolumną partycji, albo utworzenie indeksu klastrowego niezależnie od ograniczenia zawierającego kolumnę partycji. W drugim przypadku możesz odtworzyć ograniczenie NONCLUSTERED
bez uwzględnienia kolumny partycji. Ponieważ teraz to ograniczenie nie jest wyrównane (co oznacza, że jego indeks pomocniczy nie jest podzielony na partycje), musisz określić, gdzie umieścić go na dysku.
Załóżmy, że tabela miała taki klucz podstawowy:
ALTER TABLE dbo.pt ADD CONSTRAINT ptc PRIMARY KEY CLUSTERED (Id) ON [PRIMARY];
Aby podzielić tę tabelę na partycje, musisz najpierw usunąć ograniczenie:
ALTER TABLE dbo.pt DROP CONSTRAINT ptc;
Następnie musisz utworzyć indeks klastrowany podzielony na partycje:
CREATE UNIQUE CLUSTERED INDEX ptci ON dbo.pt(pc, Id) ON ps1(pc) ;
Jeśli zdecydujesz się odtworzyć PRIMARY KEY
wiązanie niezrównane, możesz to zrobić w następujący sposób:
ALTER TABLE dbo.pt ADD CONSTRAINT ptc PRIMARY KEY NONCLUSTERED (Id) ON [PRIMARY];
4. Twoja tabela nie ma indeksu klastrowego
W takim przypadku w większości przypadków zaleca się utworzenie indeksu klastrowego w celu ustanowienia partycjonowania. Możesz do tego użyć wcześniej utworzonej instrukcji tworzenia indeksu:
CREATE UNIQUE CLUSTERED INDEX ptci ON dbo.pt(pc, Id) ON ps1(pc) ;
Jeśli jednak masz dobry powód, aby nie tworzyć indeksu klastrowego, możesz zastosować następujące dwustopniowe podejście. Niestety nie ma bezpośredniego sposobu na dokonanie tej zmiany.
Załóżmy, że twoja tabela nie ma indeksu klastrowego. Aby podzielić tabelę na partycje, musisz najpierw utworzyć CLUSTERED UNIQUE
ograniczenie. (Możesz również użyć CLUSTERED PRIMARY KEY
ograniczenia). Jeśli masz unikalną kombinację kolumn, jest to prosty krok:
ALTER TABLE dbo.pt ADD CONSTRAINT ptc UNIQUE CLUSTERED(pc,id);
Po utworzeniu ograniczenia możesz je upuścić ponownie i jednocześnie „przenieść” tabelę do nowego schematu partycji:
ALTER TABLE dbo.pt DROP CONSTRAINT ptc WITH(MOVE TO ps1(pc));
Jeśli nie masz unikalnej kombinacji kolumn, nie masz szczęścia. W takim przypadku jedyną opcją jest dodanie nowej kolumny i wypełnienie jej unikalnymi wartościami. Jeśli stół jest dość mały, możesz zrobić coś takiego:
ALTER TABLE dbo.pt ADD tmp_id INT IDENTITY(1,1);
Jednak zajmie to wyłączną blokadę tabeli, dopóki wszystkie wiersze nie zostaną wycenione. W zależności od wielkości stołu może to trwać dość długo. Po utworzeniu tej kolumny wykonaj dwa powyższe kroki, aby najpierw utworzyć UNIQUE
ograniczenie, a następnie natychmiast je upuścić. Następnie możesz ponownie upuścić kolumnę. Wszystkie te kroki są dość inwazyjne, więc prawdopodobnie lepiej jest po prostu utworzyć indeks klastrowany na stole. To wcale nie musi być wyjątkowe.
Jeśli masz wersję Enterprise, możesz użyć WITH(ONLINE=ON)
klauzuli na większości powyższych stwierdzeń. Dzięki temu Twój stół będzie dostępny dla innych połączeń. Jednak w tym czasie będzie miało to wpływ na wydajność.