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

Skift til en partition i SQL Server (T-SQL)

I SQL Server kan du skifte partitioner ind og ud af en partitioneret tabel.

Du kan gøre dette med ALTER TABLE udmelding. Grundlæggende går det sådan her:

ALTER TABLE OldTable
SWITCH TO NewTable PARTITION x

Dette skifter partitionen til OldTable ind i partitionen x af NewTable (hvor x er partitionsnummeret).

Eksempel

Inden vi begynder at skifte ind, lad os sætte to borde op. En (kaldet OrdersOld ) vil indeholde de data, som vi vil "skifte ind" til den anden tabel (kaldet OrdersNew ).

Vi opdeler OrdersNew i fire skillevægge.

-- Create filegroups
ALTER DATABASE Test ADD FILEGROUP OrdersNewFg1;
GO

ALTER DATABASE Test ADD FILE (  
    NAME = OrdersNewFg1dat,  
    FILENAME = '/var/opt/mssql/data/OrdersNewFg1dat.ndf',  
    SIZE = 5MB,  
    MAXSIZE = 100MB,  
    FILEGROWTH = 5MB
    )  
TO FILEGROUP OrdersNewFg1;
GO

ALTER DATABASE Test ADD FILEGROUP OrdersNewFg2;
GO

ALTER DATABASE Test ADD FILE (  
    NAME = OrdersNewFg2dat,  
    FILENAME = '/var/opt/mssql/data/OrdersNewFg2dat.ndf',  
    SIZE = 5MB,  
    MAXSIZE = 100MB,  
    FILEGROWTH = 5MB
    )  
TO FILEGROUP OrdersNewFg2;
GO
ALTER DATABASE Test ADD FILEGROUP OrdersNewFg3;
GO

ALTER DATABASE Test ADD FILE (  
    NAME = OrdersNewFg3dat,  
    FILENAME = '/var/opt/mssql/data/OrdersNewFg3dat.ndf',  
    SIZE = 5MB,  
    MAXSIZE = 100MB,  
    FILEGROWTH = 5MB
    )  
TO FILEGROUP OrdersNewFg3;
GO
ALTER DATABASE Test ADD FILEGROUP OrdersNewFg4;
GO

ALTER DATABASE Test ADD FILE (  
    NAME = OrdersNewFg4dat,  
    FILENAME = '/var/opt/mssql/data/OrdersNewFg4dat.ndf',  
    SIZE = 5MB,  
    MAXSIZE = 100MB,  
    FILEGROWTH = 5MB
    )  
TO FILEGROUP OrdersNewFg4;
GO

-- Create a partition function that will result in four partitions  
CREATE PARTITION FUNCTION OrdersNewPartitionFunction (date)  
    AS RANGE RIGHT FOR VALUES (
        '20200201', 
        '20200301',
        '20200401'
    );
GO

-- Create a partition scheme that maps the partitions to the filegroups
CREATE PARTITION SCHEME OrdersNewPartitionScheme
    AS PARTITION OrdersNewPartitionFunction  
    TO (
        OrdersNewFg1,
        OrdersNewFg2,
        OrdersNewFg3,
        OrdersNewFg4
        );  
GO

-- Create a table that contains the data that we will be switching in.  
-- Note that the filegroup matches the filegroup of the partition that we will switch in to.
-- Include CHECK constraint to restrict data to the range specified in the switch-in partition
CREATE TABLE OrdersOld (
    OrderDate date NOT NULL,
    OrderId int IDENTITY NOT NULL,
    OrderDesc varchar(255) NOT NULL,
    CONSTRAINT chkDate CHECK (OrderDate >= '20200301' AND OrderDate < '20200401'),
    CONSTRAINT PKOrdersOld PRIMARY KEY CLUSTERED(OrderDate, OrderId)
    )
    ON OrdersNewFg3;
GO

-- Insert data into the OrdersOld table. This is the data we will be switching in to the OrdersNew table.
INSERT INTO OrdersOld(OrderDate, OrderDesc) VALUES
    ('20200302', 'Cat food'),
    ('20200315', 'Water bowl'),
    ('20200318', 'Saddle for camel'),
    ('20200321', 'Dog biscuits'),
    ('20200328', 'Bigfoot shoes');
GO

-- Create a partitioned table called OrdersNew that uses the OrderDate column as the partitioning column
CREATE TABLE OrdersNew (
    OrderDate date NOT NULL,
    OrderId int IDENTITY NOT NULL,
    OrderDesc varchar(255) NOT NULL,
    CONSTRAINT PKOrdersNew PRIMARY KEY CLUSTERED(OrderDate, OrderId)
    )  
    ON OrdersNewPartitionScheme (OrderDate);  
GO

-- Check how many rows are in each table
SELECT COUNT(*) AS OrdersOld 
FROM OrdersOld;

SELECT COUNT(*) AS OrdersNew
FROM OrdersNew;

Resultat:

+-------------+
| OrdersOld   |
|-------------|
| 5           |
+-------------+

+-------------+
| OrdersNew   |
|-------------|
| 0           |
+-------------+

Så som det ser ud lige nu, OrdersOld indeholder 5 rækker og OrdersNew er tom.

Tid til at skifte data.

ALTER TABLE OrdersOld
SWITCH TO OrdersNew PARTITION 3;

Resultat:

Commands completed successfully.

Dataene er nu blevet skiftet til partition 3 i destinationstabellen.

Lad os tjekke begge tabeller igen.

SELECT COUNT(*) AS OrdersOld 
FROM OrdersOld;

SELECT COUNT(*) AS OrdersNew
FROM OrdersNew;

Resultat:

+-------------+
| OrdersOld   |
|-------------|
| 0           |
+-------------+

+-------------+
| OrdersNew   |
|-------------|
| 5           |
+-------------+

Denne gang OrdersOld er tom og OrdersNew indeholder 5 rækker.

Vi kan også køre følgende forespørgsel for at kontrollere den faktiske partition, som dataene er placeret i.

SELECT 
    p.partition_number AS [Partition], 
    fg.name AS [Filegroup], 
    p.Rows
FROM sys.partitions p
    INNER JOIN sys.allocation_units au
    ON au.container_id = p.hobt_id
    INNER JOIN sys.filegroups fg
    ON fg.data_space_id = au.data_space_id
WHERE p.object_id = OBJECT_ID('OrdersNew')
ORDER BY [Partition];

Resultat:

+-------------+--------------+--------+
| Partition   | Filegroup    | Rows   |
|-------------+--------------+--------|
| 1           | OrdersNewFg1 | 0      |
| 2           | OrdersNewFg2 | 0      |
| 3           | OrdersNewFg3 | 5      |
| 4           | OrdersNewFg4 | 0      |
+-------------+--------------+--------+

Som forventet er alle 5 rækker allokeret til partition 3 i OrdersNewFg3 filgruppe.

Almindelige fejl

Fejl 4982

I mit eksempel ovenfor vil du bemærke, at jeg oprettede en CHECK begrænsning ved oprettelse af OrdersOld tabel.

Hvis du får fejlmeddelelse 4982 (ALTER TABLE SWITCH statement failed... ), kan det være, at du ikke har oprettet en CHECK begrænsning på kildetabellen.

Eller det kan være, at du har oprettet en CHECK begrænsning, men den gennemtvinger ikke værdier mellem intervallet for indkoblingspartitionen.

Du skal sikre dig, at indkoblingsværdierne faktisk er inden for det område, der er defineret af partitionen, og SQL Server vil lede efter en CHECK begrænsning på kildetabellen, der bekræfter dette.

Fejl 4939

En anden almindelig er fejl 4939 (ALTER TABLE SWITCH statement failed... ).

Hvis du får denne fejl, er det sandsynligvis fordi du forsøger at skifte til en partition, der bruger en anden filgruppe end kildetabellen.

Et af kravene til at skifte partition er, at både kildetabellen eller -partitionen og måltabellen eller -partitionen skal være placeret i den samme filgruppe.

For at rette denne fejl skal du sørge for, at kildetabellen bruger den samme filgruppe som destinationspartitionen.

Slukning

Se Udskiftning af en partition i SQL Server for, hvordan du udskifter en partition.


  1. Hvordan kan jeg VÆLGE rækker med MAX(kolonneværdi), PARTITION efter en anden kolonne i MYSQL?

  2. 3 måder at få månedsnavnet fra en dato i SQL Server (T-SQL)

  3. MariaDB JSON_INSERT() Forklaret

  4. Dvalebrug af PostgreSQL-sekvens påvirker ikke sekvenstabellen