Hvis du har en partitioneret tabel eller et indeks i SQL Server, men du har brug for flere partitioner, kan du tilføje en partition til partitionsfunktionen ved at bruge ALTER PARTITION FUNCTION
sætning med SPLIT RANGE
argument.
Når du gør dette, opdeler du en eksisterende partition i to.
Eksempel
Her er et eksempel til at demonstrere. Lad os først se på vores nuværende opsætning.
Nuværende opsætning
Vi har allerede fire partitioner, og vi vil tilføje en femte.
Så vi har allerede oprettet en partitionsfunktion som denne:
CREATE PARTITION FUNCTION MoviesPartitionFunction (int)
AS RANGE LEFT FOR VALUES (-1, 100, 10000);
Denne kode resulterer i partitioner, der gemmer værdier som følger.
Partition | Værdier |
---|---|
1 | <=–1 |
2 | > –1 OG <=100 |
3 | > 100 OG <=10000 |
4 | > 10000 |
I dette eksempel tilføjer vi en ny grænseværdi på 500.
Så vi ønsker, at det skal se sådan ud:
Partition | Værdier |
---|---|
1 | <=–1 |
2 | > –1 OG <=100 |
3 | > 100 OG <=500 |
4 | > 500 OG <=10000 |
5 | > 10000 |
Forestil dig også, med henblik på dette eksempel, at vi har en tabel, der er partitioneret ved hjælp af ovenstående partitionsfunktion, og den indeholder i øjeblikket lidt over fire tusinde rækker af data.
Lad os tage et hurtigt kig på, hvordan rækkerne er fordelt på tværs af vores partitioner:
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Resultat:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 3979 | | 4 | 0 | +--------------------+-------------+
Så vi vil nu tilføje en ny partition med en grænseværdi på 500.
I dette tilfælde vil vi opdele partitionen mellem grænseværdierne 100 og 10000.
Jeg bør nævne, at Microsoft fraråder at opdele befolkede partitioner. Så det er noget at huske på.
Men til formålet med dette eksempel opdeler vi en partition, der indeholder data.
Opdel partitionen
Det er her, vi går videre og opdeler partitionen.
Vi bruger ALTER PARTITION FUNCTION
sætning for at opdele partitionen.
Men opdeling af en partition skaber to partitioner ud af en, og så vi skal sikre os, at der er en filgruppe til den nye partition. Vi skal også sikre os, at vores partitionsskema ved, hvilken filgruppe der skal bruges, når vi opdeler partitionen.
Du kan bruge en eksisterende filgruppe, eller du kan oprette en ny.
Lad os oprette en ny.
Her er koden, vi kan bruge til at gøre alt ovenstående:
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);
Resultat:
Commands completed successfully.
Vi har opdelt partitionen.
Bekræft opdelingen
Vi kan nu bekræfte, at partitionsfunktionen er blevet ændret til at afspejle de nye grænseværdier.
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';
Resultat:
+---------------+---------+ | boundary_id | value | |---------------+---------| | 1 | -1 | | 2 | 100 | | 3 | 500 | | 4 | 10000 | +---------------+---------+
Så vi kan se, at den nye grænseværdi er blevet tilføjet med succes.
Og her er, hvordan dataene nu er fordelt på tværs af partitionerne.
SELECT
partition_number,
row_count
FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('dbo.Movies');
Resultat:
+--------------------+-------------+ | partition_number | row_count | |--------------------+-------------| | 1 | 0 | | 2 | 100 | | 3 | 400 | | 4 | 3579 | | 5 | 0 | +--------------------+-------------+
Så vi har nu 5 partitioner.
Hvorfor have tomme partitioner?
Hvis du undrer dig over, hvorfor jeg har tomme partitioner i hver ende, gøres dette specifikt for at lette opdeling og sammenlægning af partitioner.
At holde partitioner tomme i hver ende forhindrer enhver uventet databevægelse, du måtte få, når du opdeler eller flette partitioner.
Denne praksis anbefales også af Microsoft, netop af denne grund.
Opdeling af partitioner, der indeholder data
Som nævnt fraråder Microsoft at opdele partitioner, der allerede indeholder data.
Opdeling eller sammenlægning af befolkede partitioner kan være ineffektivt. De kan være ineffektive, fordi opdelingen eller fletningen kan forårsage så meget som fire gange mere loggenerering og kan også forårsage alvorlig låsning.