sql >> Databasteknik >  >> RDS >> Sqlserver

Slå samman två partitioner till en i SQL Server (T-SQL)

I SQL Server kan du använda ALTER PARTITION FUNCTION för att slå samman två partitioner till en partition.

För att göra detta, använd MERGE RANGE argument, samtidigt som det tillhandahåller gränsvärdet för den partition som ska släppas.

Denna operation tar bort partitionen och slår samman alla värden som finns i partitionen till en återstående partition.

Exempel

Föreställ dig att vi har fem partitioner som vi vill ska bli fyra.

Aktuella partitioner

Vi har en partitionsfunktion som heter MoviesPartitionFunction med fyra gränsvärden.

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 att det finns fem partitioner.

För det här exemplet släpper vi gränsintervallet 500.

Föreställ dig också att vi redan har en tabell med data fördelade över några av dessa partitioner.

Så här är raderna för närvarande fördelade över partitionerna.

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

Jag bör påpeka att Microsoft faktiskt avråder från att slå samman (eller dela upp) partitioner som innehåller data. Men i det här exemplet kommer vi att vara försiktiga och slå samman två partitioner som innehåller data.

Slå samman partitionerna

OK, låt oss slå samman partitioner.

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

Resultat:

Commands completed successfully.

Vi har slagit samman partitionerna.

Kontrollera resultatet

Låt oss kolla 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 väntat har gränsintervallet på 500 tagits bort, och vi har bara tre gränsintervall kvar.

Låt oss se hur data fördelas över partitionerna.

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

Återigen som förväntat har data från partitionerna 3 och 4 slagits samman till en partition (partition 3).

Varför ha tomma partitioner?

Om du undrar varför jag har tomma partitioner i varje ände, görs detta specifikt för att underlätta uppdelning och sammanslagning av partitioner.

Att hålla partitioner tomma i varje ände förhindrar alla oväntade datarörelser du kan få när du delar upp eller slår samman partitioner.

Denna praxis rekommenderas också av Microsoft, av just denna anledning.

Sammanfogar partitioner som innehåller data

Som nämnts avråder Microsoft från att slå samman partitioner som redan innehåller data.

Att dela eller slå samman befolkade partitioner kan vara ineffektivt. De kan vara ineffektiva eftersom uppdelningen eller sammanslagning kan orsaka så mycket som fyra gånger mer stockgenerering och kan också orsaka allvarlig låsning.


  1. Timeout för anslutning för DriverManager getConnection

  2. Översikt över programmering på serversidan i PostgreSQL

  3. Parameter Sniffing, Inbäddning och ÅTERKOMPILERING

  4. Hur får man det första och sista datumet för innevarande år?