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

Opdel en partition i to i SQL Server (T-SQL)

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.


  1. Ydeevne af tabelvariabler i SQL Server

  2. Hierarkisk liste over triggerhændelsestyper i SQL Server 2017

  3. Forklar JOIN vs. LEFT JOIN og WHERE-tilstandsforslag mere detaljeret

  4. Tjek, om der findes en midlertidig tabel, og slet, om den findes, før du opretter en midlertidig tabel