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

Comment mapper plusieurs partitions sur un seul groupe de fichiers dans SQL Server (T-SQL)

Si vous êtes habitué à créer des tables partitionnées dans SQL Server, vous avez peut-être l'habitude de créer un groupe de fichiers distinct pour chaque partition. Cela a ses avantages et pourrait très bien être la méthode que vous choisiriez dans la plupart des scénarios.

Cependant, vous avez également la possibilité de mapper plusieurs partitions sur un seul groupe de fichiers.

Dans cet article, je partage deux exemples de mappage de plusieurs partitions sur un seul groupe de fichiers.

  • Exemple 1 mappe tous partitions à un seul groupe de fichiers.
  • L'exemple 2 mappe certaines partitions à un groupe de fichiers et d'autres à un autre.

Exemple 1 - Mapper toutes les partitions sur un seul groupe de fichiers

Pour mapper toutes les partitions sur un seul groupe de fichiers, utilisez l'argument ALL. Cela spécifie que toutes les partitions correspondent au groupe de fichiers spécifié ou au groupe de fichiers principal si [PRIMARY] est spécifié.

Notez que lorsque ALL est spécifié, un seul groupe de fichiers peut être spécifié.

-- Create one filegroup
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

-- Create a partition function that will result in twelve partitions  
CREATE PARTITION FUNCTION OrdersNewPartitionFunction (date)  
    AS RANGE RIGHT FOR VALUES (
        '20200201', 
        '20200301',
        '20200401', 
        '20200501',
        '20200601',
        '20200701',
        '20200801',
        '20200901',
        '20201001',
        '20201101',
        '20201201'
    );
GO

-- Create a partition scheme that maps all partitions to the OrdersNewFg1 filegroup
CREATE PARTITION SCHEME OrdersNewPartitionScheme
    AS PARTITION OrdersNewPartitionFunction  
    ALL TO (OrdersNewFg1);  
GO

-- Create a partitioned table
CREATE TABLE OrdersNew (
    OrderDate date NOT NULL,
    OrderId int IDENTITY NOT NULL,
    OrderDesc varchar(255) NOT NULL
    )  
    ON OrdersNewPartitionScheme (OrderDate);  
GO

Ici, j'ai fait ce qui suit :

  • Création d'un groupe de fichiers et d'un fichier associé
  • Créé une fonction de partition
  • Création d'un schéma de partition
  • Créé une table qui utilise ce schéma de partition

La partie clé est la dernière ligne du CREATE PARTITION SCHEME déclaration. Plus précisément, c'est le ALL mot-clé qui mappe toutes les partitions au groupe de fichiers spécifié.

Si vous les mappiez à plusieurs groupes de fichiers, vous omettez ALL , puis avoir une liste de groupes de fichiers séparés par des virgules au lieu d'un seul.

Vérifier le mappage

Nous pouvons utiliser la requête suivante pour vérifier que chaque partition est mappée sur le même groupe de fichiers.

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

Résultat :

+-------------+--------------+--------+
| Partition   | Filegroup    | Rows   |
|-------------+--------------+--------|
| 1           | OrdersNewFg1 | 0      |
| 2           | OrdersNewFg1 | 0      |
| 3           | OrdersNewFg1 | 0      |
| 4           | OrdersNewFg1 | 0      |
| 5           | OrdersNewFg1 | 0      |
| 6           | OrdersNewFg1 | 0      |
| 7           | OrdersNewFg1 | 0      |
| 8           | OrdersNewFg1 | 0      |
| 9           | OrdersNewFg1 | 0      |
| 10          | OrdersNewFg1 | 0      |
| 11          | OrdersNewFg1 | 0      |
| 12          | OrdersNewFg1 | 0      |
+-------------+--------------+--------+

Cette requête nous montre également combien de lignes se trouvent dans chaque partition. Nous n'avons inséré aucune donnée, elles sont donc toutes nulles.

Exemple 2 - Mapper certaines partitions sur un seul groupe de fichiers

Cet exemple est presque identique à l'exemple précédent, sauf que nous mappons les douze partitions sur deux groupes de fichiers distincts.

Dans ce cas, nous omettons le ALL argument, car un seul groupe de fichiers peut être spécifié lorsque ALL est spécifié.

-- Create two 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

-- Create a partition function that will result in twelve partitions  
CREATE PARTITION FUNCTION OrdersNewPartitionFunction (date)  
    AS RANGE RIGHT FOR VALUES (
        '20200201', 
        '20200301',
        '20200401', 
        '20200501',
        '20200601',
        '20200701',
        '20200801',
        '20200901',
        '20201001',
        '20201101',
        '20201201'
    );
GO

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

-- Create a partitioned table
CREATE TABLE OrdersNew (
    OrderDate date NOT NULL,
    OrderId int IDENTITY NOT NULL,
    OrderDesc varchar(255) NOT NULL
    )  
    ON OrdersNewPartitionScheme (OrderDate);  
GO

Vérifier le mappage

Voyons comment les partitions sont mappées aux groupes de fichiers.

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

Résultat :

+-------------+--------------+--------+
| Partition   | Filegroup    | Rows   |
|-------------+--------------+--------|
| 1           | OrdersNewFg1 | 0      |
| 2           | OrdersNewFg1 | 0      |
| 3           | OrdersNewFg1 | 0      |
| 4           | OrdersNewFg1 | 0      |
| 5           | OrdersNewFg1 | 0      |
| 6           | OrdersNewFg1 | 0      |
| 7           | OrdersNewFg2 | 0      |
| 8           | OrdersNewFg2 | 0      |
| 9           | OrdersNewFg2 | 0      |
| 10          | OrdersNewFg2 | 0      |
| 11          | OrdersNewFg2 | 0      |
| 12          | OrdersNewFg2 | 0      |
+-------------+--------------+--------+

Comme prévu, les six premières partitions sont mappées au premier groupe de fichiers et les autres sont mappées au second.