sql >> Database >  >> RDS >> Sqlserver

Voeg twee partities samen tot één in SQL Server (T-SQL)

In SQL Server kunt u de ALTER PARTITION FUNCTION . gebruiken om twee partities samen te voegen tot één partitie.

Gebruik hiervoor het MERGE RANGE argument, terwijl de grenswaarde van de te laten vallen partitie wordt opgegeven.

Met deze bewerking wordt de partitie verwijderd en worden alle waarden die in de partitie bestaan, samengevoegd tot een resterende partitie.

Voorbeeld

Stel je voor dat we vijf partities hebben waarvan we er vier willen worden.

Huidige partities

We hebben een partitiefunctie genaamd MoviesPartitionFunction met vier grenswaarden.

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   |
+---------------+---------+

Dit betekent dat er vijf partities zijn.

Voor dit voorbeeld laten we het grensbereik van 500 vallen.

Stel je ook voor dat we al een tabel hebben met gegevens die over sommige van deze partities zijn verdeeld.

Hier ziet u hoe de rijen momenteel over de partities zijn 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           |
+--------------------+-------------+

Ik moet erop wijzen dat Microsoft eigenlijk afraadt om partities die gegevens bevatten samen te voegen (of te splitsen). Voor het doel van dit voorbeeld zullen we echter voorzichtig zijn en twee partities samenvoegen die gegevens bevatten.

De partities samenvoegen

OK, laten we partities samenvoegen.

ALTER PARTITION FUNCTION MoviesPartitionFunction()  
MERGE RANGE (500);

Resultaat:

Commands completed successfully.

We hebben de partities succesvol samengevoegd.

Controleer het resultaat

Laten we het resultaat eens bekijken.

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             | 10000   |
+---------------+---------+

Zoals verwacht is het grensbereik van 500 weggelaten en blijven er nog maar drie grensbereiken over.

Laten we eens kijken hoe de gegevens over de partities zijn 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                  | 3979        |
| 4                  | 0           |
+--------------------+-------------+

Zoals verwacht zijn de gegevens van partities 3 en 4 samengevoegd tot één partitie (partitie 3).

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 samenvoegen die gegevens bevatten

Zoals vermeld raadt Microsoft af om partities samen te voegen 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. SQL Server:primaire sleutel van tabel ophalen met SQL-query

  2. RDS vergelijken met EC2 voor het beheren van MySQL of MariaDB op AWS

  3. PostgreSQL-databases migreren van op locatie naar de cloud met AWS RDS

  4. Unitils en DBMaintainer - hoe kan ik ze laten werken met meerdere gebruikers/schema's?