Sądzę, że byłoby to dość proste pytanie, ale tak naprawdę miałem trudności ze znalezieniem odpowiedzi na to pytanie.
Pytanie: Czy możesz przenosić wiersze danych w tabeli podzielonej na partycje z jednej partycji do drugiej, po prostu aktualizując kolumnę partycji, tak aby przekraczała granicę partycji?
Na przykład, jeśli mam tabelę z kluczem partycji:
CREATE TABLE SampleTable
(
SampleID INT PRIMARY KEY,
SampleResults VARCHAR(100) NOT NULL,
)
Dzięki funkcji partycji mapowanej na klucz podstawowy:
CREATE PARTITION FUNCTION MyPartitionFunc (INT) AS
RANGE LEFT FOR VALUES (10000, 20000);
Czy mogę przenieść wiersz z pierwszej partycji do trzeciej partycji, zmieniając SampleID z 1 na (powiedzmy) 500 000?
Uwaga: Oznaczam to jako serwer SQL 2005 i 2008, ponieważ oba obsługują partycjonowanie. Czy traktują to inaczej?
$PARTITION
oblicza tylko numer partycji na podstawie danych wejściowych; tak naprawdę nie sprawdza, gdzie fizycznie żyje rząd.Aby to przetestować, eksperyment faktycznie musi podzielić tabelę. Zobacz http://www.kodyaz.com/articles/how-to-partition-table-non-partitioned-table-sql-server-2008.aspx
Zapytanie o funkcję partycjonowania mówi ci tylko, co mówi funkcja partycjonowania. Nie mówi, gdzie są przechowywane dane. Możesz skonfigurować funkcję partycjonowania i uruchomić ją bez partycjonowania tabeli, jak już tutaj pokazano.
Aby podzielić tabelę na partycje, musisz także utworzyć grupy plików i schemat partycjonowania, który używa funkcji partycjonowania do przypisywania wyników funkcji do grup plików. Następnie musisz umieścić klucz klastrowany w tabeli korzystającej z tego schematu partycjonowania.
Skonfiguruj partycjonowanie
Nie jestem ekspertem od SQL wiersza poleceń. Użyłem interfejsu SSMS, aby skonfigurować grupy plików pfg1 (z plikiem pf1) i pfg2 (z plikiem pf2). Następnie zadeklarowałem funkcję i schemat partycjonowania:
Utwórz tabelę i indeks klastrowany
Gdy to zrobisz, po zapytaniu o sys.partitions (mam 2005), zobaczysz, że tabela ma teraz dwie partycje zamiast tylko jednej dla tabeli. Oznacza to, że w pełni zaimplementowaliśmy partycjonowanie dla tej tabeli.
Teraz, gdy mamy dwie partycje (z liczbą wierszy dla każdej), możemy przeprowadzić eksperyment.
Wstaw rzędy
Sprawdź sys.partitions, aby zobaczyć, co się stało.
Tak. Jeden rząd w każdej partycji.
Przenieś rząd.
Sprawdź partycje
Pierwsza partycja ma teraz dwa wiersze zamiast 1, a druga partycja ma zero wierszy zamiast dwóch.
Myślę, że to potwierdza, że wiersz został automatycznie przeniesiony w wyniku modyfikacji klucza klastrowego w tabeli podzielonej na partycje.
źródło
Nie sądzę, aby ta odpowiedź była poprawna. Gdy użyjesz tej wartości
po prostu przeliczasz, jaka powinna być partycja, a nie miejsce, w którym aktualnie znajduje się rekord.
Powinieneś użyć:
W moich testach na SQL 2005 wartość zmienia się, ale rekord pozostaje na tej samej partycji. Prawdopodobnie spowoduje to bałagan ze statystykami i optymalizatorem, ponieważ będzie działał w trybie wielowątkowym, oczekując, że partycja będzie w określonym zakresie. Będzie to również całkowicie błędne, gdy spróbuje użyć eliminacji partycji do zapytania tylko o odpowiednią partycję. Myślę, że musisz usunąć i ponownie wstawić każdy rekord, aby go przenieść.
źródło
$partition
tutaj sugeruje, że zaakceptowana odpowiedź jest poprawna. W jaki sposób potwierdzasz, że rekord pozostaje na tej samej partycji po jego aktualizacji?