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

Scal dwie partycje w jedną w programie SQL Server (T-SQL)

W SQL Server możesz użyć ALTER PARTITION FUNCTION aby połączyć dwie partycje w jedną partycję.

Aby to zrobić, użyj MERGE RANGE argument, podając wartość graniczną partycji do usunięcia.

Ta operacja usuwa partycję i łączy wszystkie wartości istniejące w partycji z pozostałą partycją.

Przykład

Wyobraź sobie, że mamy pięć partycji, które chcemy stać się czterema.

Aktualne partycje

Mamy funkcję partycji o nazwie MoviesPartitionFunction z czterema wartościami granicznymi.

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 |+---------------+---------+

Oznacza to, że istnieje pięć partycji.

W tym przykładzie zmniejszymy zakres granic 500.

Wyobraź sobie również, że mamy już tabelę z danymi rozproszonymi na niektórych z tych partycji.

Oto, jak wiersze są obecnie rozłożone 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 |+---------------------+-------------+

Powinienem zaznaczyć, że Microsoft faktycznie odradza łączenie (lub dzielenie) partycji zawierających dane. Jednak na potrzeby tego przykładu rzucimy ostrożność i połączymy dwie partycje zawierające dane.

Połącz partycje

OK, połączmy partycje.

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

Wynik:

Polecenia zakończone pomyślnie.

Pomyślnie połączyliśmy partycje.

Sprawdź wynik

Sprawdźmy wynik.

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 | 10000 |+---------------+---------+

Zgodnie z oczekiwaniami, zakres graniczny 500 został porzucony i pozostały tylko trzy zakresy graniczne.

Zobaczmy, jak dane są rozłożone 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 | 3979 || 4 | 0 |+---------------------+-------------+

Ponownie zgodnie z oczekiwaniami dane z partycji 3 i 4 połączyły się w jedną partycję (partycja 3).

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.

Scalanie partycji zawierających dane

Jak wspomniano, Microsoft odradza łączenie 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 wykonać kopię zapasową bazy danych SQL Server za pomocą T-SQL

  2. 6 sposobów konwersji ciągu na wartość daty/godziny w SQL Server

  3. Oszacuj oszczędności związane z kompresją danych w SQL Server

  4. Jak wyeksportować dane SQL Server z tabeli do pliku CSV

  5. Uruchom SERVERPROPERTY() na połączonym serwerze w SQL Server