sql >> Database >  >> RDS >> Sqlserver

Schakel een partitie in SQL Server (T-SQL) in

In SQL Server kunt u partities in en uit een gepartitioneerde tabel schakelen.

U kunt dit doen met de ALTER TABLE uitspraak. In principe gaat het als volgt:

ALTER TABLE OldTable
SWITCH TO NewTable PARTITION x

Dit schakelt de partitie voor OldTable naar partitie x van NewTable (waar x is het partitienummer).

Voorbeeld

Laten we, voordat we beginnen in te schakelen, twee tafels instellen. Eén (genaamd OrdersOld ) bevat de gegevens die we willen "inschakelen" naar de andere tabel (genaamd OrdersNew ).

We zullen OrdersNew indelen in vier partities.

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

Resultaat:

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

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

Dus zoals het er nu uitziet, OrdersOld bevat 5 rijen en OrdersNew is leeg.

Tijd om de gegevens in te schakelen.

ALTER TABLE OrdersOld
SWITCH TO OrdersNew PARTITION 3;

Resultaat:

Commands completed successfully.

De gegevens zijn nu met succes overgeschakeld naar partitie 3 van de bestemmingstabel.

Laten we beide tabellen nogmaals controleren.

SELECT COUNT(*) AS OrdersOld 
FROM OrdersOld;

SELECT COUNT(*) AS OrdersNew
FROM OrdersNew;

Resultaat:

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

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

Deze keer OrdersOld is leeg en OrdersNew bevat 5 rijen.

We kunnen ook de volgende query uitvoeren om de daadwerkelijke partitie te controleren waarin de gegevens zich bevinden.

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];

Resultaat:

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

Zoals verwacht zijn alle 5 rijen toegewezen aan partitie 3, in de OrdersNewFg3 bestandsgroep.

Veelvoorkomende fouten

Fout 4982

In mijn voorbeeld hierboven zul je merken dat ik een CHECK . heb gemaakt beperking bij het maken van de OrdersOld tafel.

Als u foutmelding 4982 krijgt (ALTER TABLE SWITCH statement failed... ), kan het zijn dat u geen CHECK . heeft aangemaakt beperking op de brontabel.

Of het kan zijn dat u een CHECK . heeft aangemaakt beperking, maar het dwingt geen waarden af ​​tussen het bereik van de inschakelpartitie.

U moet ervoor zorgen dat de inschakelwaarden in feite binnen het bereik vallen dat door de partitie is gedefinieerd, en SQL Server zoekt naar een CHECK beperking op de brontabel die dit verifieert.

Fout 4939

Een andere veel voorkomende is fout 4939 (ALTER TABLE SWITCH statement failed... ).

Als je deze foutmelding krijgt, komt dat waarschijnlijk omdat je probeert over te schakelen naar een partitie die een andere bestandsgroep gebruikt dan de brontabel.

Een van de vereisten voor het wisselen van partities is dat zowel de brontabel of -partitie, als de doeltabel of -partitie zich in dezelfde bestandsgroep moeten bevinden.

Om deze fout op te lossen, moet u ervoor zorgen dat de brontabel dezelfde bestandsgroep gebruikt als de doelpartitie.

Uitschakelen

Zie Een partitie uitschakelen in SQL Server voor het uitschakelen van een partitie.


  1. Hoe werk ik automatisch een tijdstempel bij in PostgreSQL

  2. Hoe LPAD() werkt in MariaDB

  3. Hoe u deze 3 veelvoorkomende toegangsproblemen kunt oplossen

  4. Regex gebruiken in WHERE in Postgres