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

Dividi una partizione in due in SQL Server (T-SQL)

Se hai una tabella o un indice partizionato in SQL Server, ma hai bisogno di più partizioni, puoi aggiungere una partizione alla funzione di partizione usando ALTER PARTITION FUNCTION istruzione con il SPLIT RANGE argomento.

Quando lo fai, dividi in due una partizione esistente.

Esempio

Ecco un esempio da dimostrare. Per prima cosa, diamo un'occhiata alla nostra configurazione attuale.

Configurazione attuale

Abbiamo già quattro partizioni e vogliamo aggiungerne una quinta.

Quindi abbiamo già creato una funzione di partizione come questa:

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

Questo codice genera partizioni che memorizzano i valori come segue.

Partizione Valori
1 <=–1
2 > –1 E <=100
3 > 100 E <=10000
4 > 10000

Per questo esempio, aggiungeremo un nuovo valore limite di 500.

Quindi vogliamo che assomigli a questo:

Partizione Valori
1 <=–1
2 > –1 E <=100
3 > 100 E <=500
4 > 500 E <=10000
5 > 10000

Inoltre, ai fini di questo esempio, immagina di avere una tabella partizionata utilizzando la funzione di partizione sopra e che attualmente contiene poco più di quattromila righe di dati.

Diamo una rapida occhiata a come le righe sono distribuite nelle nostre 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           |
+--------------------+-------------+

Quindi ora vogliamo aggiungere una nuova partizione con un valore limite di 500.

In questo caso, divideremo la partizione tra i valori limite 100 e 10000.

Dovrei menzionare che Microsoft sconsiglia di dividere le partizioni popolate. Quindi è qualcosa da tenere a mente.

Tuttavia, ai fini di questo esempio, suddivideremo una partizione che contiene dati.

Dividi la partizione

Ecco dove andiamo avanti e dividiamo la partizione.

Usiamo la ALTER PARTITION FUNCTION istruzione per dividere la partizione.

Tuttavia, la divisione di una partizione crea due partizioni in una, quindi dobbiamo assicurarci che ci sia un filegroup per la nuova partizione. Dobbiamo anche assicurarci che il nostro schema di partizione sappia quale filegroup usare quando dividiamo la partizione.

Puoi utilizzare un filegroup esistente o crearne uno nuovo.

Creiamone uno nuovo.

Ecco il codice che possiamo usare per fare tutto quanto sopra:

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);

Risultato:

Commands completed successfully.

Abbiamo diviso con successo la partizione.

Verifica la divisione

Possiamo ora verificare che la funzione di partizione sia stata modificata per riflettere i nuovi 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   |
+---------------+---------+

Quindi possiamo vedere che il nuovo valore limite è stato aggiunto con successo.

Ed ecco come i dati vengono ora distribuiti 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                  | 400         |
| 4                  | 3579        |
| 5                  | 0           |
+--------------------+-------------+

Quindi ora abbiamo 5 partizioni.

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 di dati che potresti ottenere durante la divisione o l'unione di partizioni.

Questa pratica è consigliata anche da Microsoft, proprio per questo motivo.

Dividi partizioni che contengono dati

Come accennato, Microsoft sconsiglia di dividere le 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.