ALTER PARTITION-FUNKTIONEN (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Microsoft Fabric

Ändrar en partitionsfunktion genom att dela upp eller slå ihop dess randvärden. Att köra en ALTER PARTITION FUNCTION-sats kan dela upp en tabell- eller indexpartition som använder partitionsfunktionen i två partitioner. Satsen kan också slå ihop två partitioner till en partition.

Försiktighet

Fler än en tabell eller ett index kan använda samma partitionsfunktion. ALTER PARTITION FUNCTION påverkar alla dem i en enda transaktion.

Transact-SQL syntaxkonventioner

Syntax

  
ALTER PARTITION FUNCTION partition_function_name()  
{   
    SPLIT RANGE ( boundary_value )  
  | MERGE RANGE ( boundary_value )   
} [ ; ]  

Arguments

partition_function_name
Är namnet på partitionsfunktionen som ska ändras.

DELAT OMRÅDE ( boundary_value )
Lägger till en partition till partitionfunktionen. boundary_value bestämmer intervallet för den nya partitionen och måste skilja sig från de befintliga randintervallen för partitionfunktionen. Baserat på boundary_value delar databasmotorn upp ett av de befintliga intervallen i två. Av dessa två intervall är det med den nya boundary_value den nya partitionen.

En filgrupp måste finnas online. Och partitionsschemat som använder partitionsfunktionen som NEXT USED för att hålla den nya partitionen måste markera filgruppen. En CREATE PARTITION SCHEME-sats tilldelar filgrupper till partitioner. CREATE PARTITION FUNCTION-satsen skapar färre partitioner än filgrupper för att hålla dem. En CREATE PARTITION SCHEME-sats kan avsätta fler filgrupper än nödvändigt. Om det händer kommer du att få otilldelade filgrupper. Dessutom markerar partitionsschemat en av filgrupperna som NÄSTA ANVÄNDA. Denna filgrupp innehåller den nya partitionen. Om det inte finns några filgrupper som partitioneringsschemat markerar som NÄSTA ANVÄNDA, måste du använda ett ALTER PARTITION SCHEME-uttalande.

ALTER PARTITION SCHEME-satsen kan antingen lägga till en filgrupp, eller välja en befintlig, för att hålla den nya partitionen. Du kan tilldela en filgrupp som redan innehåller partitioner för att hålla ytterligare partitioner. En partitionsfunktion kan delta i mer än ett partitionsschema. Av denna anledning måste alla partitionsscheman som använder partitionfunktionen du lägger till partitioner till ha en NEXT USED-filgrupp. Annars misslyckas satsen ALTER PARTITION FUNCTION med ett fel som visar partitionsschemat eller scheman som saknar en NEXT USED-filgrupp.

Om du skapar alla partitioner i samma filgrupp tilldelas den filgruppen initialt automatiskt att vara NÄSTA ANVÄNDA-filgrupp. Men efter att en delad operation körts finns det inte längre någon vald NEXT USED-filgrupp. Tilldela explicit filgruppen som NÄSTA ANVÄNDA filgrupp genom att använda ALTER PARTITION SCHEME, annars kommer en kommande split-operation att misslyckas.

Anmärkning

Begränsningar med kolumnlagringsindex: Endast tomma partitioner kan delas upp när ett kolumnlagringsindex finns i tabellen. Du måste ta bort eller inaktivera kolumnlagre-indexet innan du utför denna operation.

SLÅ IHOP [ RÄCKVIDD ( boundary_value) ]
Tar bort en partition och slår ihop alla värden som finns i partitionen till en kvarvarande partition. RANGE (boundary_value) måste vara ett existerande randvärde för den partition som ska tas bort. Detta argument tar bort filgruppen som ursprungligen innehöll boundary_value från partitionsschemat om inte en kvarvarande partition använder den, eller markerar den med egenskapen NEXT USED. Den sammanslagna partitionen finns i filgruppen som inte innehöll boundary_value från början. boundary_value är ett konstant uttryck som kan referera till variabler (inklusive användardefinierade typvariabler) eller funktioner (inklusive användardefinierade funktioner). Den kan inte referera till ett Transact-SQL uttryck. boundary_value måste antingen matcha eller vara implicit konvertibel till datatypen i dess motsvarande partitioneringskolumn. Du kan inte heller trunkera boundary_value under implicit konvertering så att värdets storlek och skala inte matchar motsvarande input_parameter_type.

Anmärkning

Begränsningar med kolumnlagringsindex: Två icke-tomma partitioner som innehåller ett kolumnlagringsindex kan inte slås ihop. Du måste ta bort eller inaktivera columnstore-indexet innan du utför denna operation

Metodtips

Behåll alltid tomma partitioner i båda ändar av partitionsområdet. Behåll partitionerna i båda ändar för att säkerställa att partitionsdelningen och partitionssammanslagningen inte orsakar någon datarörelse. Partitionsdelningen sker i början och partitionssammanslagningen sker i slutet. Undvik att dela upp eller slå ihop befolkade partitioner. Att dela upp eller slå ihop befolkade partitioner kan vara ineffektivt. De kan vara ineffektiva eftersom delningen eller sammanslagningen kan orsaka upp till fyra gånger mer loggenerering, och kan också orsaka allvarlig låsning.

Den främsta anledningen till att placera dina partitioner på flera filgrupper är att säkerställa att du självständigt kan utföra säkerhetskopiering och återställning på partitioner. Läs mer om filgrupper och partitioneringsstrategier i Filegroups.

Begränsningar och restriktioner

ALTER PARTITION FUNCTION ompartitionerar alla tabeller och index som använder funktionen i en enda atomär operation. Denna operation sker dock offline, och beroende på omfördelningens omfattning kan den vara resurskrävande.

Använd endast ALTER PARTITION FUNCTION för att dela upp en partition i två, eller för att slå ihop två partitioner till en. För att ändra hur en tabell annars är partitionerad (till exempel från 10 partitioner till fem partitioner), använd något av följande alternativ. Beroende på systemets konfiguration kan dessa alternativ variera i resursanvändning:

  • Skapa en ny partitionerad tabell med den nödvändiga partitionsfunktionen. Lägg sedan in data från den gamla tabellen i den nya tabellen genom att använda en INSERT INTO... SELECT FROM statement.

  • Skapa ett partitionerat klustrat index på en heap.

    Anmärkning

    Att ta bort ett partitionerat klustrat index resulterar i en partitionerad heap.

  • Släpp och bygg om ett befintligt uppdelat index genom att använda satsen Transact-SQL CREATE INDEX med klausulen DROP EXISTING = ON.

  • Kör en sekvens av ALTER PARTITION FUNCTION-satser.

Alla filgrupper som påverkas av ALTER PARTITION FUNCTION måste vara online.

ALTER PARTITION FUNCTION misslyckas när ett inaktiverat klustrat index finns på några tabeller som använder partitionsfunktionen.

Databasmotorn erbjuder inte replikeringsstöd för att ändra en partitionsfunktion. Ändringar i en partitionsfunktion i publiceringsdatabasen måste appliceras manuellt i prenumerationsdatabasen.

Permissions

Någon av följande behörigheter kan användas för att köra ALTER PARTITION FUNCTION:

  • ÄNDRA ALLA DATASPACE-behörigheter. Den här behörigheten är standard för medlemmar i sysadmin fast serverroll och db_owner och db_ddladmin fasta databasroller.

  • KONTROLL- eller ALTER-behörighet för databasen där partitionsfunktionen skapades.

  • CONTROL SERVER eller behörigheten ALTER ANY DATABASE på servern för databasen där partitionsfunktionen skapades.

Examples

A. Dela upp en partition i en partitionerad tabell eller index i två partitioner

I följande exempel skapas en partitionsfunktion för att partitionera en tabell eller index i fyra partitioner. ALTER PARTITION FUNCTION delar upp en av partitionerna i två för att skapa totalt fem partitioner.

IF EXISTS (SELECT * FROM sys.partition_functions  
    WHERE name = 'myRangePF1')  
DROP PARTITION FUNCTION myRangePF1;  
GO  
CREATE PARTITION FUNCTION myRangePF1 (int)  
AS RANGE LEFT FOR VALUES ( 1, 100, 1000 );  
GO  
--Split the partition between boundary_values 100 and 1000  
--to create two partitions between boundary_values 100 and 500  
--and between boundary_values 500 and 1000.  
ALTER PARTITION FUNCTION myRangePF1 ()  
SPLIT RANGE (500);  

B. Slå ihop två partitioner i en partitionerad tabell till en partition

Följande exempel skapar samma partitionsfunktion som ovan, och slår sedan ihop två av partitionerna till en partition, totalt tre partitioner.

IF EXISTS (SELECT * FROM sys.partition_functions  
    WHERE name = 'myRangePF1')  
DROP PARTITION FUNCTION myRangePF1;  
GO  
CREATE PARTITION FUNCTION myRangePF1 (int)  
AS RANGE LEFT FOR VALUES ( 1, 100, 1000 );  
GO  
--Merge the partitions between boundary_values 1 and 100  
--and between boundary_values 100 and 1000 to create one partition  
--between boundary_values 1 and 1000.  
ALTER PARTITION FUNCTION myRangePF1 ()  
MERGE RANGE (100);  

Nästa steg

Läs mer om tabellpartitionering och relaterade koncept i följande artiklar: