Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Podziel partycję na dwie w SQL Server (T-SQL)

Jeśli masz partycjonowaną tabelę lub indeks w SQL Server, ale potrzebujesz więcej partycji, możesz dodać partycję do funkcji partycji za pomocą ALTER PARTITION FUNCTION oświadczenie z SPLIT RANGE argument.

Kiedy to zrobisz, podzielisz istniejącą partycję na dwie.

Przykład

Oto przykład do zademonstrowania. Najpierw spójrzmy na naszą obecną konfigurację.

Aktualna konfiguracja

Mamy już cztery partycje i chcemy dodać piątą.

Stworzyliśmy już taką funkcję partycji:

CREATE PARTITION FUNCTION MoviesPartitionFunction (int)  
    AS RANGE LEFT FOR VALUES (-1, 100, 10000); 

Ten kod skutkuje partycjami, które przechowują wartości w następujący sposób.

Partycja Wartości
1 <=–1
2 > –1 ORAZ <=100
3 > 100 ORAZ <=10000
4 > 10000

W tym przykładzie dodamy nową wartość graniczną 500.

Więc chcemy, żeby wyglądało to tak:

Partycja Wartości
1 <=–1
2 > –1 ORAZ <=100
3 > 100 ORAZ <=500
4 > 500 ORAZ <=10000
5 > 10000

Ponadto na potrzeby tego przykładu wyobraź sobie, że mamy tabelę podzieloną na partycje za pomocą powyższej funkcji partycjonowania, która obecnie zawiera nieco ponad cztery tysiące wierszy danych.

Rzućmy okiem na to, jak wiersze są rozłożone na naszych partycjach:

SELECT 
    partition_number,
    row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies'); 

Wynik:

+---------------------+--------------+| numer_partycji | liczba_wierszów ||--------------------+-------------||| 1 | 0 || 2 | 100 || 3 | 3979 || 4 | 0 |+---------------------+-------------+

Dlatego teraz chcemy dodać nową partycję z wartością graniczną 500.

W takim przypadku podzielimy partycję między wartości graniczne 100 i 10000.

Powinienem wspomnieć, że Microsoft odradza dzielenie zaludnionych partycji. Warto o tym pamiętać.

Jednak na potrzeby tego przykładu podzielimy partycję zawierającą dane.

Podziel partycję

Oto, gdzie idziemy dalej i dzielimy partycję.

Używamy ALTER PARTITION FUNCTION oświadczenie o podzieleniu partycji.

Jednak podzielenie partycji tworzy dwie partycje z jednej, dlatego musimy upewnić się, że istnieje grupa plików dla nowej partycji. Musimy również upewnić się, że nasz schemat partycji wie, której grupy plików użyć podczas dzielenia partycji.

Możesz użyć istniejącej grupy plików lub możesz utworzyć nową.

Stwórzmy nowy.

Oto kod, którego możemy użyć, aby wykonać wszystkie powyższe czynności:

ALTER DATABASE Test ADD FILEGROUP MoviesFg5;

ALTER DATABASE Test   
ADD FILE   
(  
    NAME = MoviesFg5dat,  
    FILENAME = '/var/opt/mssql/data/MoviesFg5dat.ndf',  
    SIZE = 5MB,  
    MAXSIZE = 100MB,  
    FILEGROWTH = 5MB  
)  
TO FILEGROUP MoviesFg5;

ALTER PARTITION SCHEME MoviesPartitionScheme  
NEXT USED MoviesFg5;

ALTER PARTITION FUNCTION MoviesPartitionFunction()
SPLIT RANGE (500); 

Wynik:

Polecenia zakończone pomyślnie.

Pomyślnie podzieliliśmy partycję.

Zweryfikuj podział

Możemy teraz sprawdzić, czy funkcja partycji została zmodyfikowana w celu odzwierciedlenia nowych wartości granicznych.

SELECT 
    prv.boundary_id,
    prv.[value]
FROM sys.partition_range_values prv
INNER JOIN sys.partition_functions pf
ON prv.function_id = pf.function_id
WHERE pf.name = 'MoviesPartitionFunction'; 

Wynik:

+---------------+---------+| identyfikator_granicy | wartość ||---------------+---------|| 1 | -1 || 2 | 100 || 3 | 500 || 4 | 10000 |+---------------+---------+

Widzimy więc, że nowa wartość graniczna została pomyślnie dodana.

A oto jak dane są teraz rozprowadzane na partycjach.

SELECT 
    partition_number,
    row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies'); 

Wynik:

+---------------------+--------------+| numer_partycji | liczba_wierszów ||--------------------+-------------||| 1 | 0 || 2 | 100 || 3 | 400 || 4 | 3579 || 5 | 0 |+---------------------+-------------+

Więc mamy teraz 5 partycji.

Dlaczego są puste partycje?

Jeśli zastanawiasz się, dlaczego mam puste partycje na każdym końcu, jest to zrobione specjalnie, aby ułatwić dzielenie i łączenie partycji.

Utrzymywanie pustych partycji na obu końcach zapobiega wszelkim nieoczekiwanym przesunięciom danych, które mogą wystąpić podczas dzielenia lub łączenia partycji.

Ta praktyka jest również zalecana przez firmę Microsoft, właśnie z tego powodu.

Podział partycji zawierających dane

Jak wspomniano, Microsoft odradza dzielenie partycji, które już zawierają dane.

Dzielenie lub scalanie zaludnionych partycji może być nieefektywne. Mogą być nieefektywne, ponieważ dzielenie lub łączenie może powodować nawet czterokrotnie więcej generowania logów, a także może powodować poważne blokowanie.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak połączyć Python z SQL Server, aby zautomatyzować proces backendu?

  2. Maksymalna wartość podzapytania T-SQL (data) i łączenia

  3. Usuń wszystkie tabele, których nazwy zaczynają się od określonego ciągu

  4. Zarządzaj plikami MDF w SQL Server 2019

  5. Jak usunąć spacje nierozdzielające z kolumny na serwerze SQL?