Als u bekend bent met het maken van gepartitioneerde tabellen in SQL Server, bent u misschien gewend om voor elke partitie een aparte bestandsgroep te maken. Dit heeft zijn voordelen, en zou in de meeste scenario's heel goed de methode kunnen zijn die u zou kiezen.
U hebt echter ook de mogelijkheid om meerdere partities aan een enkele bestandsgroep toe te wijzen.
In dit artikel deel ik twee voorbeelden van het toewijzen van meerdere partities aan een enkele bestandsgroep.
- Voorbeeld 1 brengt alle in kaart partities naar een enkele bestandsgroep.
- Voorbeeld 2 wijst sommige partities toe aan de ene bestandsgroep en sommige aan een andere.
Voorbeeld 1 – Wijs alle partities toe aan een enkele bestandsgroep
Gebruik het argument ALL om alle partities toe te wijzen aan een enkele bestandsgroep. Dit specificeert dat alle partities worden toegewezen aan de opgegeven bestandsgroep, of aan de primaire bestandsgroep als [PRIMARY]
is opgegeven.
Merk op dat wanneer ALL
is opgegeven, kan slechts één bestandsgroep worden opgegeven.
-- 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
Hier deed ik het volgende:
- Een bestandsgroep en bijbehorend bestand gemaakt
- Een partitiefunctie gemaakt
- Een partitieschema gemaakt
- Een tabel gemaakt die dat partitieschema gebruikt
Het belangrijkste onderdeel is de laatste regel van het CREATE PARTITION SCHEME
uitspraak. Het is met name de ALL
trefwoord dat alle partities toewijst aan de opgegeven bestandsgroep.
Als u ze aan meerdere bestandsgroepen zou toewijzen, zou u ALL
. weglaten , heb dan een door komma's gescheiden lijst van bestandsgroepen in plaats van slechts één.
Controleer de toewijzing
We kunnen de volgende query gebruiken om te verifiëren dat elke partitie is toegewezen aan dezelfde bestandsgroep.
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');
Resultaat:
+-------------+--------------+--------+ | 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 | +-------------+--------------+--------+
Deze query laat ons ook zien hoeveel rijen er in elke partitie zijn. We hebben geen gegevens ingevoegd, dus ze zijn allemaal nul.
Voorbeeld 2 – Enkele partities toewijzen aan een enkele bestandsgroep
Dit voorbeeld is bijna identiek aan het vorige voorbeeld, behalve dat we de twaalf partities toewijzen aan twee afzonderlijke bestandsgroepen.
In dit geval laten we de ALL
. weg argument, omdat er slechts één bestandsgroep kan worden opgegeven wanneer ALL
is opgegeven.
-- 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
Controleer de toewijzing
Laten we eens kijken hoe de partities zijn toegewezen aan de bestandsgroepen.
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');
Resultaat:
+-------------+--------------+--------+ | 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 | +-------------+--------------+--------+
Zoals verwacht worden de eerste zes partities toegewezen aan de eerste bestandsgroep en de rest wordt toegewezen aan de tweede.