Nếu bạn đã quen với việc tạo các bảng được phân vùng trong SQL Server, bạn có thể quen với việc tạo một nhóm tệp riêng biệt cho từng phân vùng. Điều này có những lợi ích của nó và rất có thể là phương pháp bạn sẽ chọn trong hầu hết các tình huống.
Tuy nhiên, bạn cũng có tùy chọn ánh xạ nhiều phân vùng vào một nhóm tệp duy nhất.
Trong bài viết này, tôi chia sẻ hai ví dụ về ánh xạ nhiều phân vùng vào một nhóm tệp duy nhất.
- Ví dụ 1 bản đồ tất cả phân vùng cho một nhóm tệp duy nhất.
- Ví dụ 2 ánh xạ một số phân vùng tới một nhóm tệp và một số phân vùng sang nhóm khác.
Ví dụ 1 - Ánh xạ tất cả các phân vùng thành một nhóm tệp duy nhất
Để ánh xạ tất cả các phân vùng vào một nhóm tệp, hãy sử dụng đối số TẤT CẢ. Điều này chỉ định rằng tất cả các phân vùng ánh xạ tới nhóm tệp được chỉ định hoặc đến nhóm tệp chính nếu [PRIMARY]
được chỉ định.
Lưu ý rằng khi ALL
được chỉ định, chỉ có thể chỉ định một nhóm tệp.
-- 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
Ở đây, tôi đã làm như sau:
- Đã tạo một nhóm tệp và tệp được liên kết
- Đã tạo một chức năng phân vùng
- Đã tạo một lược đồ phân vùng
- Đã tạo một bảng sử dụng lược đồ phân vùng đó
Phần quan trọng là dòng cuối cùng của CREATE PARTITION SCHEME
tuyên bố. Cụ thể, đó là ALL
từ khóa ánh xạ tất cả các phân vùng tới nhóm tệp được chỉ định.
Nếu bạn đang ánh xạ chúng đến nhiều nhóm tệp, bạn sẽ bỏ qua ALL
, sau đó có danh sách các nhóm tệp được phân tách bằng dấu phẩy thay vì chỉ một nhóm.
Kiểm tra ánh xạ
Chúng tôi có thể sử dụng truy vấn sau để xác minh rằng mỗi phân vùng được ánh xạ tới cùng một nhóm tệp.
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');
Kết quả:
+-------------+--------------+--------+ | 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 | +-------------+--------------+--------+
Truy vấn này cũng cho chúng ta biết có bao nhiêu hàng trong mỗi phân vùng. Chúng tôi chưa chèn bất kỳ dữ liệu nào nên chúng hoàn toàn bằng không.
Ví dụ 2 - Ánh xạ một số phân vùng thành một nhóm tệp đơn
Ví dụ này gần giống với ví dụ trước, ngoại trừ việc chúng tôi ánh xạ mười hai phân vùng trên hai nhóm tệp riêng biệt.
Trong trường hợp này, chúng tôi bỏ qua ALL
đối số, vì chỉ có thể chỉ định một nhóm tệp khi ALL
được chỉ định.
-- 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
Kiểm tra ánh xạ
Hãy xem cách các phân vùng được ánh xạ tới các nhóm tệp.
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');
Kết quả:
+-------------+--------------+--------+ | 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 | +-------------+--------------+--------+
Như mong đợi, sáu phân vùng đầu tiên được ánh xạ tới nhóm tệp đầu tiên và phần còn lại được ánh xạ tới phân vùng thứ hai.