Als je een gepartitioneerde tabel of index hebt in SQL Server, maar je hebt meer partities nodig, dan kun je een partitie toevoegen aan de partitiefunctie met behulp van de ALTER PARTITION FUNCTION
statement met de SPLIT RANGE
argument.
Wanneer u dit doet, splitst u een bestaande partitie in tweeën.
Voorbeeld
Hier is een voorbeeld om te demonstreren. Laten we eerst eens kijken naar onze huidige setup.
Huidige instellingen
We hebben al vier partities en we willen een vijfde toevoegen.
We hebben dus al een partitiefunctie gemaakt zoals deze:
CREATE PARTITION FUNCTION MoviesPartitionFunction (int)
AS RANGE LEFT FOR VALUES (-1, 100, 10000);
Deze code resulteert in partities die waarden als volgt opslaan.
Partitie | Waarden |
---|---|
1 | <=–1 |
2 | > –1 EN <=100 |
3 | > 100 EN <=10000 |
4 | > 10000 |
Voor dit voorbeeld voegen we een nieuwe grenswaarde van 500 toe.
Dus we willen dat het er zo uitziet:
Partitie | Waarden |
---|---|
1 | <=–1 |
2 | > –1 EN <=100 |
3 | > 100 EN <=500 |
4 | > 500 EN <=10000 |
5 | > 10000 |
Stel je voor dit voorbeeld voor dat we een tabel hebben die is gepartitioneerd met behulp van de bovenstaande partitiefunctie en die momenteel iets meer dan vierduizend rijen gegevens bevat.
Laten we eens kijken hoe de rijen zijn verdeeld over onze partities:
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Resultaat:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 3979 | | 4 | 0 | +--------------------+-------------+
We willen nu dus een nieuwe partitie toevoegen met een grenswaarde van 500.
In dit geval splitsen we de partitie tussen grenswaarden 100 en 10000.
Ik moet vermelden dat Microsoft aanbeveelt om bevolkte partities niet te splitsen. Dus dat is iets om in gedachten te houden.
Voor het doel van dit voorbeeld splitsen we echter een partitie die gegevens bevat.
De partitie splitsen
Hier gaan we verder en splitsen de partitie.
We gebruiken de ALTER PARTITION FUNCTION
statement om de partitie te splitsen.
Het splitsen van een partitie maakt echter twee partities van één, en dus moeten we ervoor zorgen dat er een bestandsgroep is voor de nieuwe partitie. We moeten er ook voor zorgen dat ons partitieschema weet welke bestandsgroep we moeten gebruiken wanneer we de partitie splitsen.
U kunt een bestaande bestandsgroep gebruiken of u kunt een nieuwe maken.
Laten we een nieuwe maken.
Dit is de code die we kunnen gebruiken om al het bovenstaande te doen:
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);
Resultaat:
Commands completed successfully.
We hebben de partitie succesvol gesplitst.
Verifieer de splitsing
We kunnen nu verifiëren dat de partitiefunctie is aangepast om de nieuwe grenswaarden weer te geven.
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';
Resultaat:
+---------------+---------+ | boundary_id | value | |---------------+---------| | 1 | -1 | | 2 | 100 | | 3 | 500 | | 4 | 10000 | +---------------+---------+
We kunnen dus zien dat de nieuwe grenswaarde succesvol is toegevoegd.
En zo worden de gegevens nu over de partities verdeeld.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Resultaat:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 400 | | 4 | 3579 | | 5 | 0 | +--------------------+-------------+
Dus we hebben nu 5 partities.
Waarom lege partities?
Als je je afvraagt waarom ik aan elk uiteinde lege partities heb, is dit specifiek gedaan om het splitsen en samenvoegen van partities te vergemakkelijken.
Door partities aan elk uiteinde leeg te houden, voorkomt u onverwachte gegevensverplaatsing die u kunt krijgen bij het splitsen of samenvoegen van partities.
Precies om deze reden wordt deze praktijk ook aanbevolen door Microsoft.
Partities splitsen die gegevens bevatten
Zoals vermeld raadt Microsoft af om partities te splitsen die al gegevens bevatten.
Het splitsen of samenvoegen van bevolkte partities kan inefficiënt zijn. Ze kunnen inefficiënt zijn omdat het splitsen of samenvoegen tot wel vier keer meer loggeneratie kan veroorzaken, en ook ernstige vergrendeling kan veroorzaken.