sql >> Databasteknik >  >> RDS >> Sqlserver

Dela en partition i två i SQL Server (T-SQL)

Om du har en partitionerad tabell eller index i SQL Server, men du behöver fler partitioner, kan du lägga till en partition till partitionsfunktionen med ALTER PARTITION FUNCTION med SPLIT RANGE argument.

När du gör detta delar du upp en befintlig partition i två.

Exempel

Här är ett exempel att visa. Låt oss först titta på vår nuvarande konfiguration.

Nuvarande inställningar

Vi har redan fyra partitioner, och vi vill lägga till en femte.

Så vi har redan skapat en partitionsfunktion så här:

CREATE PARTITION FUNCTION MoviesPartitionFunction (int)  
    AS RANGE LEFT FOR VALUES (-1, 100, 10000);

Denna kod resulterar i partitioner som lagrar värden enligt följande.

Partition Värden
1 <=–1
2 > –1 OCH <=100
3 > 100 OCH <=10000
4 > 10000

I det här exemplet kommer vi att lägga till ett nytt gränsvärde på 500.

Så vi vill att det ska se ut så här:

Partition Värden
1 <=–1
2 > –1 OCH <=100
3 > 100 OCH <=500
4 > 500 OCH <=10000
5 > 10000

Föreställ dig också för detta exempel att vi har en tabell som är partitionerad med hjälp av ovanstående partitionsfunktion, och den innehåller för närvarande drygt fyra tusen rader med data.

Låt oss ta en snabb titt på hur raderna är fördelade över våra 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 vill nu lägga till en ny partition med ett gränsvärde på 500.

I det här fallet kommer vi att dela upp partitionen mellan gränsvärdena 100 och 10000.

Jag bör nämna att Microsoft rekommenderar att inte dela upp befolkade partitioner. Så det är något att tänka på.

Men för detta exempel delar vi upp en partition som innehåller data.

Dela partitionen

Här går vi vidare och delar upp partitionen.

Vi använder ALTER PARTITION FUNCTION uttalande för att dela upp partitionen.

Men att dela en partition skapar två partitioner av en, och så vi måste se till att det finns en filgrupp för den nya partitionen. Vi måste också se till att vårt partitionsschema vet vilken filgrupp som ska användas när vi delar upp partitionen.

Du kan använda en befintlig filgrupp, eller så kan du skapa en ny.

Låt oss skapa en ny.

Här är koden vi kan använda för att göra allt ovan:

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 lyckats dela upp partitionen.

Verifiera uppdelningen

Vi kan nu verifiera att partitionsfunktionen har modifierats för att återspegla de nya gränsvärdena.

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 att det nya gränsvärdet har lagts till framgångsrikt.

Och här är hur data nu 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                  | 400         |
| 4                  | 3579        |
| 5                  | 0           |
+--------------------+-------------+

Så vi har nu 5 partitioner.

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.

Dela upp partitioner som innehåller data

Som nämnts rekommenderar Microsoft att man inte delar upp 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. Hur man ställer in och loggar in som root-användare i MySQL

  2. MySQL:Hur återställer eller ändrar jag MySQL root-lösenordet?

  3. Anledning till varför Oracle är skiftlägeskänsligt?

  4. ROWID (oracle) - någon användning för det?