sql >> Database >  >> RDS >> Sqlserver

Splits een partitie in tweeën in SQL Server (T-SQL)

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.


  1. Hoe maak je een verwijderde tabel opnieuw aan met Django Migrations?

  2. Upgrades zonder downtime gemakkelijk gemaakt met ClusterControl

  3. 2 manieren om een ​​tabel te maken als deze niet bestaat in SQL Server

  4. Gratis webhosting met PHP-ondersteuning