Filegroup Trong SQL Server

Vũ Huy Tâm

Filegroup là tên đặt cho một nhóm data file trong SQL Server. Filegroup không chứa dữ liệu, mà chỉ định nghĩa ở mức logic các data file nằm trong đó, và đến lượt các data file này mới thực chứa dữ liệu. Bạn có thể hình dung filegroup giống như một thư mục của Windows, và các data file thuộc về filegroup đó tương tự như các file trong thư mục. Khi bạn tạo một database, ở mức đơn giản nhất sẽ có hai file được tạo ra là một log file (.ldf) và một data file (.mdf). Tuy nhiên một điều có thể bạn ít để ý hơn là cũng có một filegroup được tạo ra cùng với nó:

CREATE DATABASE TestDB
GO 
USE TestDB
GO 
--xem thông tin các file trong database
SELECT * FROM SYS.DATABASE_FILES
 
-- xem thông tin các filegroup trong database
SELECT * FROM SYS.FILEGROUPS

Như kết quả hai câu truy vấn trên cho thấy, một file group có tên “PRIMARY” được tạo ra, và data file của database thuộc về group này (data_space_id chính là filegroup ID). Từ đây bạn có thể tạo filegroup và file cho database:

-- tạo filegroup
ALTER DATABASE TestDB ADD FILEGROUP FG1
ALTER DATABASE TestDB ADD FILEGROUP FG2
 
-- thêm 2 data file vào FG1 và 1 file vào FG2
ALTER DATABASE TestDB ADD FILE (NAME = N'F11', FILENAME = N'D:\DATA\TestDB_F11.ndf') TO FILEGROUP FG1
ALTER DATABASE TestDB ADD FILE (NAME = N'F12', FILENAME = N'E:\DATA\TestDB_F12.ndf') TO FILEGROUP FG1
ALTER DATABASE TestDB ADD FILE (NAME = N'F2', FILENAME = N'D:\DATA\TestDB_F2.ndf') TO FILEGROUP FG2

Khi tạo bảng, một cách mặc định bảng sẽ được tạo ở primary filegroup. Nhưng bạn có thể chỉ định filegroup mà bạn muốn bảng được lưu vào:

CREATE TABLE dbo.Tbl_1(Col_1 INT, Col_2 VARCHAR(50)) ON FG1

Mệnh đề “ON FG1″ sẽ lái đích đến cho bảng Tbl_1 là filegroup FG1.
Microsoft khuyến cáo trong mọi trường hợp bạn nên tạo thêm filegroup để lưu dữ liệu thay vì lưu dữ liệu vào primary filegroup. Lý do là vì primary filegroup là nơi chứa meta data của database (các thông tin định nghĩa bảng, index, view, user…) và toàn bộ mã sql của thủ tục, hàm. Nếu lưu chung dữ liệu vào đây sẽ xảy ra tranh chấp đọc/ghi giữa dữ liệu và meta data.
Không chỉ có vậy, filegroup là một công cụ rất mềm dẻo và hữu ích cho người thiết kế database. Vì mỗi filegroup có thể chứa nhiều file, bạn có thể chỉ định các file này nằm trên các ổ cứng khác nhau (như FG1 chứa 2 file nằm trên 2 ổ D: và E:). Khi cần bổ sung dung lượng cho database, bạn chỉ việc cắm thêm ổ cứng và khai báo thêm 1 file từ ổ cứng này vào filegroup. Khi ghi dữ liệu vào file, SQL Server sử dụng cơ chế quay vòng (round-robin) ghi một phần vào file thứ nhất, đến 1 phần vào file thứ hai và cứ tiếp tục, rồi lại quay trở lại file đầu. Vì thế tất cả các file trong filegroup đều được sử dụng và bạn sẽ thấy kích thước của chúng cùng nhau tăng lên. Cơ chế này giúp tăng tốc độ ghi khi các file nằm ở các ổ cứng khác nhau. Tất nhiên nếu dùng SAN và các ổ cứng có chung LUN (Logical Unit Number) thì không có gì khác nhau. Hiệu năng ghi chỉ tăng lên khi các ổ cứng thuộc về các LUN khác nhau (qua cổng I/O độc lập). Ở đây bạn thấy filegroup còn ảo hơn cả folder trong window: với folder các file nằm trong nó đều phải nằm trên cùng ổ cứng đó; trong khi với filegroup các file bên dưới có thể nằm ở bất kỳ đâu.
Việc tạo nhiều filegroup cũng giúp bạn phân chia dữ liệu dễ dàng, ví dụ với một bảng dữ liệu rất lớn và chỉ được cập nhật mỗi tháng một lần, bạn có thể lưu bảng này vào một filegroup riêng và các bảng còn lại vốn được đọc/ghi rất nhiều vào một filegroup khác. Khi backup, bạn có thể đặt chế độ backup cho từng filegroup, và bạn chỉ cần backup mỗi tháng một lần cho filegroup chứa bảng ít được cập nhật và hàng ngày cho filegroup kia.
Đồng thời, bạn cũng có thể lưu index vào một filegroup riêng với bảng và điều này cũng giúp tăng tốc độ truy xuất dữ liệu.




Tags:

7 Comments
Posted on 8/8/2012 | Categories: Database Administration, Thiết kế database

Các bài viết tương tự

Comments
  • vũ đình dũng (10/03/2013 10:33 am)

    Em cám ơn anh, những bài viết của anh rất bổ ích với sinh viên bọn em. Chúc anh sức khỏe để có nhiều bài viết hay, chia sẻ kinh nghiệm với mọi ngươi.

  • Lâm (20/03/2013 10:42 pm)

    Chào anh,
    Em có đọc qua các bài viết hướng dẫn, nhưng chỉ đề cập đến việc thay đổi đường dẫn lưu file và autogrowth. Em chưa rõ file mdf và ldf được hệ thống lưu trữ như thế nào: lưu khi có bất kỳ thao tác làm thay đổi dữ liệu hay là một thời gian cụ thể trong ngày (dạng lên lịch để lưu trữ). Có cách nào để biết được những thông tin này không ạ?

    • Vũ Huy Tâm (21/03/2013 8:47 am)

      Đây là một chủ đề lớn, liên quan đến cơ chế log và recovery. Tôi chỉ có thể trả lời ngắn gọn là dữ liệu được ghi ra file mỗi khi có checkpoint (là một tiến trình ngầm, chạy tự động bên trong hệ thống). Và kể cả trước khi được ghi ra file nhưng giao dịch đã có trong log file và trong trường hợp có sự cố (ví dụ mất điện hoặc hệ thống bị shutdown đột ngột), SQL Server đảm bảo dữ liệu sẽ được ghi ra file trọn vẹn khi khởi động lại. Lúc nào tôi sẽ viết một bài kỹ hơn về vấn đề này

      • Lâm (21/03/2013 9:59 pm)

        Cảm ơn anh nhìu, mong sớm được đọc bài viết của anh về vấn đề này^^!

      • tung (25/11/2013 9:47 pm)

        Bác viết cái này đi , em muốn hiểu cơ chế này để dựa vào nó làm cái move file và copy file khi hệ thống gặp sự cố

  • Thang (08/08/2017 3:04 am)

    “lưu index vào một filegroup riêng với bảng”- Bác có thể nói rõ hơn 1 chút về cách đưa index vào fg riêng được không, thanks

    • Vũ Huy Tâm (17/08/2017 3:35 pm)

      CREATE INDEX IndexName ON TableName(ColumnName)
      ON FG2 –FG2 là tên filegroup bạn muốn lưu index

Leave a Reply

Hướng dẫn: Để nhập mã T-SQL bạn dùng thẻ <pre lang="tsql"> và </pre>.
Ví dụ: <pre lang="tsql">SELECT * FROM MyTable</pre>