Jika Anda terbiasa membuat tabel yang dipartisi di SQL Server, Anda mungkin terbiasa membuat grup file terpisah untuk setiap partisi. Ini memiliki manfaatnya, dan mungkin merupakan metode yang akan Anda pilih di sebagian besar skenario.
Namun, Anda juga memiliki opsi untuk memetakan beberapa partisi ke satu grup file.
Pada artikel ini saya membagikan dua contoh pemetaan beberapa partisi ke satu filegroup.
- Contoh 1 memetakan semua partisi ke satu filegroup.
- Contoh 2 memetakan beberapa partisi ke satu filegroup, dan beberapa ke yang lain.
Contoh 1 – Memetakan Semua Partisi ke Satu Filegroup
Untuk memetakan semua partisi ke satu filegroup, gunakan argumen ALL. Ini menetapkan bahwa semua partisi dipetakan ke grup file yang ditentukan, atau ke grup file utama jika [PRIMARY]
ditentukan.
Perhatikan bahwa ketika ALL
ditentukan, hanya satu grup file yang dapat ditentukan.
-- 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
Di sini, saya melakukan hal berikut:
- Membuat grup file dan file terkait
- Membuat fungsi partisi
- Membuat skema partisi
- Membuat tabel yang menggunakan skema partisi tersebut
Bagian kuncinya adalah baris terakhir dari CREATE PARTITION SCHEME
penyataan. Secara khusus, ini adalah ALL
kata kunci yang memetakan semua partisi ke grup file yang ditentukan.
Jika Anda memetakannya ke beberapa grup file, Anda akan menghilangkan ALL
, lalu buat daftar grup file yang dipisahkan koma, bukan hanya satu.
Periksa Pemetaan
Kita dapat menggunakan kueri berikut untuk memverifikasi bahwa setiap partisi dipetakan ke grup file yang sama.
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');
Hasil:
+-------------+--------------+--------+ | 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 | +-------------+--------------+--------+
Kueri ini juga menunjukkan kepada kita berapa banyak baris di setiap partisi. Kami belum memasukkan data apa pun sehingga semuanya nol.
Contoh 2 – Memetakan Beberapa Partisi ke Satu Filegroup
Contoh ini hampir identik dengan contoh sebelumnya, kecuali bahwa kami memetakan dua belas partisi di dua grup file yang terpisah.
Dalam hal ini, kami menghilangkan ALL
argumen, karena hanya satu grup file yang dapat ditentukan saat ALL
ditentukan.
-- 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
Periksa Pemetaan
Mari kita lihat bagaimana partisi dipetakan ke grup file.
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');
Hasil:
+-------------+--------------+--------+ | 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 | +-------------+--------------+--------+
Seperti yang diharapkan, enam partisi pertama dipetakan ke grup file pertama, dan sisanya dipetakan ke grup kedua.