In SQL Server puoi utilizzare ALTER PARTITION FUNCTION
per unire due partizioni in un'unica partizione.
Per fare ciò, usa il MERGE RANGE
argomento, fornendo al contempo il valore limite della partizione da eliminare.
Questa operazione elimina la partizione e unisce tutti i valori esistenti nella partizione in una partizione rimanente.
Esempio
Immagina di avere cinque partizioni che vogliamo diventare quattro.
Partizioni attuali
Abbiamo una funzione di partizione chiamata MoviesPartitionFunction
con quattro valori limite.
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';
Risultato:
+---------------+---------+ | boundary_id | value | |---------------+---------| | 1 | -1 | | 2 | 100 | | 3 | 500 | | 4 | 10000 | +---------------+---------+
Ciò significa che ci sono cinque partizioni.
Per questo esempio, elimineremo l'intervallo limite 500.
Inoltre, immagina di avere già una tabella con i dati distribuiti su alcune di queste partizioni.
Ecco come sono attualmente distribuite le righe nelle partizioni.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Risultato:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 400 | | 4 | 3579 | | 5 | 0 | +--------------------+-------------+
Dovrei sottolineare che Microsoft sconsiglia effettivamente di unire (o dividere) partizioni che contengono dati. Tuttavia, ai fini di questo esempio, getteremo al vento la cautela e uniremo due partizioni che contengono dati.
Unisci le partizioni
OK, uniamo le partizioni.
ALTER PARTITION FUNCTION MoviesPartitionFunction()
MERGE RANGE (500);
Risultato:
Commands completed successfully.
Abbiamo unito con successo le partizioni.
Verifica il risultato
Controlliamo il risultato.
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';
Risultato:
+---------------+---------+ | boundary_id | value | |---------------+---------| | 1 | -1 | | 2 | 100 | | 3 | 10000 | +---------------+---------+
Come previsto, l'intervallo limite di 500 è stato eliminato e ci restano solo tre intervalli limite.
Vediamo come vengono distribuiti i dati tra le partizioni.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Risultato:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 3979 | | 4 | 0 | +--------------------+-------------+
Anche in questo caso, come previsto, i dati delle partizioni 3 e 4 sono stati uniti in un'unica partizione (partizione 3).
Perché avere partizioni vuote?
Se ti stai chiedendo perché ho partizioni vuote a ciascuna estremità, questo viene fatto specificamente per facilitare la divisione e l'unione di partizioni.
Mantenere le partizioni vuote su ciascuna estremità impedisce qualsiasi movimento imprevisto dei dati che potresti ottenere durante la divisione o l'unione di partizioni.
Questa pratica è consigliata anche da Microsoft, proprio per questo motivo.
Unire partizioni che contengono dati
Come accennato, Microsoft sconsiglia di unire partizioni che già contengono dati.
La divisione o l'unione di partizioni popolate può essere inefficiente. Possono essere inefficienti perché la divisione o l'unione può causare una generazione di log fino a quattro volte superiore e può anche causare un blocco grave.