Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Activer une partition dans SQL Server (T-SQL)

Dans SQL Server, vous pouvez basculer des partitions dans et hors d'une table partitionnée.

Vous pouvez le faire avec le ALTER TABLE déclaration. En gros, ça se passe comme ça :

ALTER TABLE OldTable
SWITCH TO NewTable PARTITION x

Cela change la partition pour OldTable dans la partition x de NewTable (où x est le numéro de la partition).

Exemple

Avant de commencer à échanger, installons deux tables. Un (appelé OrdersOld ) contiendra les données que nous voulons "basculer" vers l'autre table (appelée OrdersNew ).

Nous partitionnerons OrdersNew en quatre partitions.

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

Résultat :

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

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

Donc, dans l'état actuel des choses, OrdersOld contient 5 lignes et OrdersNew est vide.

Il est temps de basculer dans les données.

ALTER TABLE OrdersOld
SWITCH TO OrdersNew PARTITION 3;

Résultat :

Commands completed successfully.

Les données ont maintenant été basculées avec succès vers la partition 3 de la table de destination.

Vérifions à nouveau les deux tables.

SELECT COUNT(*) AS OrdersOld 
FROM OrdersOld;

SELECT COUNT(*) AS OrdersNew
FROM OrdersNew;

Résultat :

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

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

Cette fois OrdersOld est vide et OrdersNew contient 5 lignes.

Nous pouvons également exécuter la requête suivante pour vérifier la partition réelle dans laquelle se trouvent les données.

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

Résultat :

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

Comme prévu, les 5 lignes sont allouées à la partition 3, dans le OrdersNewFg3 groupe de fichiers.

Erreurs courantes

Erreur 4982

Dans mon exemple ci-dessus, vous remarquerez que j'ai créé un CHECK contrainte lors de la création du OrdersOld tableau.

Si vous obtenez le message d'erreur 4982 (ALTER TABLE SWITCH statement failed... ), il se peut que vous n'ayez pas créé de CHECK contrainte sur la table source.

Ou il se peut que vous ayez créé un CHECK contrainte, mais elle n'applique pas les valeurs comprises dans la plage de la partition d'activation.

Vous devez vous assurer que les valeurs de basculement sont en fait dans la plage définie par la partition, et SQL Server recherchera un CHECK contrainte sur la table source qui vérifie cela.

Erreur 4939

Une autre erreur courante est l'erreur 4939 (ALTER TABLE SWITCH statement failed... ).

Si vous obtenez cette erreur, c'est probablement parce que vous essayez de basculer vers une partition qui utilise un groupe de fichiers différent de la table source.

L'une des conditions requises pour changer de partition est que la table ou la partition source et la table ou la partition cible doivent se trouver dans le même groupe de fichiers.

Pour corriger cette erreur, assurez-vous que la table source utilise le même groupe de fichiers que la partition de destination.

Désactiver

Voir Désactiver une partition dans SQL Server pour savoir comment désactiver une partition.