Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Unisci due partizioni in una in SQL Server (T-SQL)

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.