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.