Filegroup là cách gọi cho một nhóm data file trong SQL Server.
Filegroup không phải là nơi trực tiếp chứa dữ liệu mà nó chỉ là định nghĩa ở mức logic về các data file nằm trong nó, như:
- Logical Name của data file.
- File Type của data file (Rows Data, Log, FILESTREAM Data).
- Dung lượng khởi tạo (Initial Size) của data file.
- Giá trị tự tăng trưởng (Autogrowth) / Giá trị giới hạn (Maxsize) của data file.
- Đường dẫn chứa data file (Path).
- Tên data file (File Name).
Filegroup trong SQL Server và Tablespace trong Oracle là cái khái niệm tương đối giống nhau, chúng đều dùng để chứa các data file của Database.
Filegroup mặc định của SQL Server có tên gọi là PRIMARY, đây là Filegroup được tạo cùng với khi bạn tạo ra một Database. Filegroup mặc định này có chứa một data file (.mdf).
Như kết quả ở query trên, ta có thể thấy ID của Filegroup PRIMARY là 1. Filegroup này có chứa một data file với file_id = 1.
Các objects của Database (Tables, Indexes ...) khi được khởi tạo sẽ được lưu vào Filegroup mặc định (nếu không dùng mệnh đề "ON Filegroup_Name" để chỉ định nơi chứa các object).
Muốn chỉ định Filegroup sẽ chứa object, cần phải sử dụng mệnh đề ON:
Ở ví dụ trên, chúng ta đã tạo một table ở trên Filegroup tên là FILEGROUP_DATA_1 và một index ở trên Filegroup tên là FILEGROUP_IDX_1
Trong mọi trường hợp, người dùng nên tạo thêm các Filegroup để lưu trữ dữ liệu của Database (không nên sử dụng Filegroup PRIMARY mặc định để lưu trữ dữ liệu).
Lý do là vì PRIMARY Filegroup là nơi lưu trữ các meta data của Database, các thông tin định nghĩa như: bảng, user, các thủ tục... nếu lưu trữ chung dữ liệu của Database vào Filegroup PRIMARY sẽ có thể xảy ra xung đột về mặt I/O giữa dữ liệu và meta data.
Để tạo thêm Filegroup và các data file trong Filegroup, người dùng có thể sử dụng đoạn lệnh sau:
Mỗi Filegroup có thể chứa nhiều hơn 1 data file.
Như ở ví dụ trên, Filegroup FILEGROUP_DATA_1 chứa 2 data file, hai data file này được đặt ở trên 2 Volumn khác nhau (F và G). Khi lưu trữ dữ liệu vào data file, nếu một Filegroup có chứa nhiều hơn 1 data file, SQL sẽ dùng cơ chế Round-Robin để lần lượt ghi dữ liệu vào các data file. Do vậy, ta có thể nhìn thấy dung lượng của các data file này cùng tăng lên.
Trong thực tế, DBA thường tạo nhiều Filegroup cho một Database. Mỗi Filegroup sẽ dùng để chứa các loại object khác nhau. Ví dụ:
- Filegroup FILEGROUP_DATA_1 chứa các bảng dữ liêu của Database.
- Filegroup FILEGROUP_LOG_1 chứa các bảng log của Database.
- Filegroup FILEGROUP_IDX_1 chứa các index của các bảng dữ liệu.
- FilegroupFILEGROUP_LOG_IDX_1 chứa các index của các bảng log.
Việc phân chia các object của Database vào các Filegroup khác nhau sẽ làm giảm được hiện tượng phân mảnh dữ liệu trong các data file, đồng thời có thể tối ưu được I/O của các ổ cứng khi truy suất dữ liệu.
Ở hình trên, ta có thể thấy việc đọc và ghi dữ liệu vào Database SQL_Lab được chia ra xử lý ở 2 Filegroup độc lập, trên 2 Volumn khác nhau (D và F).
Việc phân chia thành nhiều Filegroup cũng giúp cho việc quản trị Database được dễ dàng hơn:
- Ta có thể dễ dàng chuyển một phần Database sang ổ cứng khác bằng cách chuyển một hoặc vài Filegroup.
- Ta có thể thực hiện backup riêng lẻ từng Filegroup thay vì phải backup cả một Database lớn.
...
Filegroup không phải là nơi trực tiếp chứa dữ liệu mà nó chỉ là định nghĩa ở mức logic về các data file nằm trong nó, như:
- Logical Name của data file.
- File Type của data file (Rows Data, Log, FILESTREAM Data).
- Dung lượng khởi tạo (Initial Size) của data file.
- Giá trị tự tăng trưởng (Autogrowth) / Giá trị giới hạn (Maxsize) của data file.
- Đường dẫn chứa data file (Path).
- Tên data file (File Name).
USE [AdventureWorks]
GO
-- Lấy thông tin filegroup của Database
[AdventureWorks]
SELECT * FROM sys.filegroups
-- Lấy thông tin data file
SELECT * FROM sys.database_files
Filegroup trong SQL Server và Tablespace trong Oracle là cái khái niệm tương đối giống nhau, chúng đều dùng để chứa các data file của Database.
Filegroup mặc định của SQL Server có tên gọi là PRIMARY, đây là Filegroup được tạo cùng với khi bạn tạo ra một Database. Filegroup mặc định này có chứa một data file (.mdf).
Như kết quả ở query trên, ta có thể thấy ID của Filegroup PRIMARY là 1. Filegroup này có chứa một data file với file_id = 1.
Các objects của Database (Tables, Indexes ...) khi được khởi tạo sẽ được lưu vào Filegroup mặc định (nếu không dùng mệnh đề "ON Filegroup_Name" để chỉ định nơi chứa các object).
Muốn chỉ định Filegroup sẽ chứa object, cần phải sử dụng mệnh đề ON:
CREATE TABLE dbo.Table_name (Column_1 INT, Column_2 NVARCHAR(10) NOT NULL) ON FILEGROUP_DATA_1
GO
CREATE INDEX IX_Table_name_Column_1 ON dbo.Table_name (Column_1) ON FILEGROUP_IDX_1
GO
Ở ví dụ trên, chúng ta đã tạo một table ở trên Filegroup tên là FILEGROUP_DATA_1 và một index ở trên Filegroup tên là FILEGROUP_IDX_1
Trong mọi trường hợp, người dùng nên tạo thêm các Filegroup để lưu trữ dữ liệu của Database (không nên sử dụng Filegroup PRIMARY mặc định để lưu trữ dữ liệu).
Lý do là vì PRIMARY Filegroup là nơi lưu trữ các meta data của Database, các thông tin định nghĩa như: bảng, user, các thủ tục... nếu lưu trữ chung dữ liệu của Database vào Filegroup PRIMARY sẽ có thể xảy ra xung đột về mặt I/O giữa dữ liệu và meta data.
Để tạo thêm Filegroup và các data file trong Filegroup, người dùng có thể sử dụng đoạn lệnh sau:
-- Tạo mới filegroup
ALTER DATABASE [AdventureWorks] ADD FILEGROUP FILEGROUP_DATA_1
ALTER DATABASE [AdventureWorks] ADD FILEGROUP FILEGROUP_IDX_1
-- Thêm data file vào các Filegroup
ALTER DATABASE [AdventureWorks] ADD FILE (NAME = N'FILEGROUP_DATA_01_01', FILENAME = N'F:\SQL_Data\FILEGROUP_DATA_01_01.ndf') TO FILEGROUP FILEGROUP_DATA_1
ALTER DATABASE [AdventureWorks] ADD FILE (NAME = N'FILEGROUP_DATA_01_02', FILENAME = N'G:\SQL_Data\FILEGROUP_DATA_01_02.ndf') TO FILEGROUP FILEGROUP_DATA_1
ALTER DATABASE [AdventureWorks] ADD FILE (NAME = N'FILEGROUP_IDX_01_01', FILENAME = N'F:\SQL_Data\FILEGROUP_IDX_01_01.ndf') TO FILEGROUP FILEGROUP_IDX_1
Mỗi Filegroup có thể chứa nhiều hơn 1 data file.
Như ở ví dụ trên, Filegroup FILEGROUP_DATA_1 chứa 2 data file, hai data file này được đặt ở trên 2 Volumn khác nhau (F và G). Khi lưu trữ dữ liệu vào data file, nếu một Filegroup có chứa nhiều hơn 1 data file, SQL sẽ dùng cơ chế Round-Robin để lần lượt ghi dữ liệu vào các data file. Do vậy, ta có thể nhìn thấy dung lượng của các data file này cùng tăng lên.
Trong thực tế, DBA thường tạo nhiều Filegroup cho một Database. Mỗi Filegroup sẽ dùng để chứa các loại object khác nhau. Ví dụ:
- Filegroup FILEGROUP_DATA_1 chứa các bảng dữ liêu của Database.
- Filegroup FILEGROUP_LOG_1 chứa các bảng log của Database.
- Filegroup FILEGROUP_IDX_1 chứa các index của các bảng dữ liệu.
- FilegroupFILEGROUP_LOG_IDX_1 chứa các index của các bảng log.
Việc phân chia các object của Database vào các Filegroup khác nhau sẽ làm giảm được hiện tượng phân mảnh dữ liệu trong các data file, đồng thời có thể tối ưu được I/O của các ổ cứng khi truy suất dữ liệu.
Ở hình trên, ta có thể thấy việc đọc và ghi dữ liệu vào Database SQL_Lab được chia ra xử lý ở 2 Filegroup độc lập, trên 2 Volumn khác nhau (D và F).
Việc phân chia thành nhiều Filegroup cũng giúp cho việc quản trị Database được dễ dàng hơn:
- Ta có thể dễ dàng chuyển một phần Database sang ổ cứng khác bằng cách chuyển một hoặc vài Filegroup.
- Ta có thể thực hiện backup riêng lẻ từng Filegroup thay vì phải backup cả một Database lớn.
...
Bài viết hay quá :) mong rằng sẽ có nhiều bài viết hay hơn nữa.
Trả lờiXóaCảm ơn bài viết của ad rất nhiều :D!!!
Trả lờiXóaNhận xét này đã bị quản trị viên blog xóa.
Trả lờiXóa