Jeśli znasz się na tworzeniu partycjonowanych tabel w SQL Server, możesz być przyzwyczajony do tworzenia oddzielnej grupy plików dla każdej partycji. Ma to swoje zalety i może być metodą, którą wybierzesz w większości scenariuszy.
Istnieje jednak również możliwość mapowania wielu partycji do jednej grupy plików.
W tym artykule udostępnię dwa przykłady mapowania wielu partycji do jednej grupy plików.
- Przykład 1 mapy wszystkie partycje do jednej grupy plików.
- Przykład 2 mapuje niektóre partycje do jednej grupy plików, a niektóre do innej.
Przykład 1 – mapowanie wszystkich partycji do pojedynczej grupy plików
Aby zmapować wszystkie partycje do jednej grupy plików, użyj argumentu ALL. Określa, że wszystkie partycje są mapowane na określoną grupę plików lub na podstawową grupę plików, jeśli [PRIMARY]
jest określony.
Zauważ, że gdy ALL
jest określony, można określić tylko jedną grupę plików.
-- 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
Tutaj zrobiłem co następuje:
- Utworzono grupę plików i skojarzony plik
- Utworzono funkcję partycji
- Utworzono schemat partycji
- Utworzono tabelę, która używa tego schematu partycji
Kluczową częścią jest ostatnia linia CREATE PARTITION SCHEME
oświadczenie. W szczególności jest to ALL
słowo kluczowe, które mapuje wszystkie partycje do określonej grupy plików.
Jeśli mapowałeś je do wielu grup plików, pominąłbyś ALL
, a następnie przygotuj listę grup plików oddzielonych przecinkami zamiast tylko jednej.
Sprawdź mapowanie
Możemy użyć następującego zapytania, aby sprawdzić, czy każda partycja jest zmapowana do tej samej grupy plików.
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');
Wynik:
+-------------+--------------+--------+ | 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 | +-------------+--------------+--------+
To zapytanie pokazuje nam również, ile wierszy znajduje się w każdej partycji. Nie wstawiliśmy żadnych danych, więc wszystkie są zerowe.
Przykład 2 – mapowanie niektórych partycji do pojedynczej grupy plików
Ten przykład jest prawie identyczny z poprzednim, z wyjątkiem tego, że mapujemy dwanaście partycji na dwie oddzielne grupy plików.
W takim przypadku pomijamy ALL
argument, ponieważ można określić tylko jedną grupę plików, gdy ALL
jest określony.
-- 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
Sprawdź mapowanie
Zobaczmy, jak partycje są mapowane do grup plików.
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');
Wynik:
+-------------+--------------+--------+ | 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 | +-------------+--------------+--------+
Zgodnie z oczekiwaniami, pierwsze sześć partycji jest mapowanych na pierwszą grupę plików, a pozostałe na drugą.