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

Flet to partitioner til én i SQL Server (T-SQL)

I SQL Server kan du bruge ALTER PARTITION FUNCTION at flette to partitioner til én partition.

For at gøre dette skal du bruge MERGE RANGE argument, mens den angiver grænseværdien for den partition, der skal falde.

Denne operation sletter partitionen og flette alle værdier, der findes i partitionen, til en resterende partition.

Eksempel

Forestil dig, at vi har fem partitioner, som vi ønsker at blive til fire.

Nuværende partitioner

Vi har en partitionsfunktion kaldet MoviesPartitionFunction med fire 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   |
+---------------+---------+

Det betyder, at der er fem partitioner.

I dette eksempel dropper vi grænseområdet 500.

Forestil dig også, at vi allerede har en tabel med data fordelt på nogle af disse partitioner.

Her er, hvordan rækkerne i øjeblikket 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           |
+--------------------+-------------+

Jeg skal påpege, at Microsoft faktisk fraråder at flette (eller opdele) partitioner, der indeholder data. Men med henblik på dette eksempel vil vi kaste forsigtighed til vinden og flette to partitioner, der indeholder data.

Flet partitionerne

OK, lad os flette partitioner.

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

Resultat:

Commands completed successfully.

Vi har flettet partitionerne sammen.

Tjek resultatet

Lad os tjekke resultatet.

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

Som forventet er grænseområdet på 500 blevet droppet, og vi står tilbage med kun tre grænseområder.

Lad os se, hvordan dataene 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                  | 3979        |
| 4                  | 0           |
+--------------------+-------------+

Igen som forventet er dataene fra partition 3 og 4 slået sammen til én partition (partition 3).

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.

Fletter partitioner, der indeholder data

Som nævnt fraråder Microsoft at flette 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. Hvad er forskellen mellem bindevariabler og substitutionsvariabler (som jeg indtaster ved hjælp af &&)?

  2. Hvordan simulerer man UNPIVOT i Access?

  3. Sortering af array-elementer

  4. Kalder lagret procedure med Out-parameter ved hjælp af PDO