Pokud jste obeznámeni s vytvářením dělených tabulek na serveru SQL Server, možná jste zvyklí na vytvoření samostatné skupiny souborů pro každý oddíl. To má své výhody a velmi dobře to může být metoda, kterou byste zvolili ve většině scénářů.
Máte však také možnost namapovat více oddílů na jednu skupinu souborů.
V tomto článku sdílím dva příklady mapování více oddílů na jednu skupinu souborů.
- Ukázka 1 mapuje všechny oddíly do jedné skupiny souborů.
- Příklad 2 mapuje některé oddíly do jedné skupiny souborů a některé do jiné.
Příklad 1 – Mapování všech oddílů do jedné skupiny souborů
Chcete-li namapovat všechny oddíly na jednu skupinu souborů, použijte argument ALL. To určuje, že se všechny oddíly mapují na zadanou skupinu souborů nebo na primární skupinu souborů, pokud [PRIMARY]
je zadáno.
Všimněte si, že když ALL
je zadáno, lze zadat pouze jednu skupinu souborů.
-- 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
Zde jsem provedl následující:
- Vytvořili skupinu souborů a přidružený soubor
- Vytvořili funkci oddílu
- Vytvořili schéma rozdělení
- Vytvořili tabulku, která používá toto schéma rozdělení
Klíčovou částí je poslední řádek CREATE PARTITION SCHEME
prohlášení. Konkrétně je to ALL
klíčové slovo, které mapuje všechny oddíly na zadanou skupinu souborů.
Pokud byste je mapovali do více skupin souborů, vynechali byste ALL
, pak mějte čárkami oddělený seznam skupin souborů místo jedné.
Zkontrolujte mapování
Můžeme použít následující dotaz k ověření, že každý oddíl je namapován na stejnou skupinu souborů.
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');
Výsledek:
+-------------+--------------+--------+ | 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 | +-------------+--------------+--------+
Tento dotaz nám také ukazuje, kolik řádků je v každém oddílu. Nevložili jsme žádná data, takže jsou všechna nula.
Příklad 2 – Mapování některých oddílů do jedné skupiny souborů
Tento příklad je téměř totožný s předchozím příkladem, kromě toho, že mapujeme dvanáct oddílů přes dvě samostatné skupiny souborů.
V tomto případě vynecháme ALL
argument, protože při ALL
lze zadat pouze jednu skupinu souborů je zadáno.
-- 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
Zkontrolujte mapování
Podívejme se, jak jsou oddíly namapovány na skupiny souborů.
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');
Výsledek:
+-------------+--------------+--------+ | 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 | +-------------+--------------+--------+
Podle očekávání je prvních šest oddílů namapováno na první skupinu souborů a zbytek je namapován na druhou.