Phân đoạn bảng trong SQL Server
Kỹ thuật phân chia bảng thành tng đoạn (Table partitioning) nhằm quản lý
hiệu quả cơ sở d liệu với dung lượng ln.
>>> Thiết lập SQL Server luôn sẵn sàng
Đây là tính ng mới được đưa vào SQL Server 2005 và tiếp tục đượcng
cường phiên bn 2008. Đối vớic ứng dụng truy cp t bên ngoài, bng
(table) vẫn là một bảng duy nhất, chỉ cu trúc vật của là khác so với
các bảng không pn đoạn.
Bng được phân đoạn dựa vào giá tr mt trường của nó (trưng đư
ợc chọn gọi
là partition key). d bn dữ liệu vc giao dịch n hàng chứa trong
bảng BanHang, bạn có thể phân đoạn theo năm của trường NgayGiaoDich
(ngày giao dịch): các giao dịch xảy ra trongm 2009 được nằm trong một
đoạn riêng, tương tự với các giao dịch ca năm 2010Kỹ thuật nàym tăng
kh năng mở rộng của SQL Server lên rt nhiều và giúp cho vic quản trị các
sở dữ liệu ln trnên dễ dàng n. Thhình dung vi một bảng d liệu
chứa vài tm triệu bản ghi thưng xuyên được cập nht, các tác vụ như
backup/restore, hoc create/rebuild index đều rất tốn m thời gian. Việc truy
vấn hoặc sửa đổi dữ liệu cũng rất vất vả. Table partitioning nhm giải quyết
các trngại đó, nó có các ưu điểm chính sau:
1. Tin lợi về quản trị:
- Bạn th backup/restore một đon mà kng nh hưởng đến các đoạn còn
lại. dụ, tại thời điểm năm 2010 các đoạn chứa dữ liệu ca 2009 và các năm
trước kng còn tiếp nhn dữ liệu mới nữa, bn kng cần phải thường xuyên
backup các đoạn này và chỉ cn backup đoạn 2010.
- Bạnng có thể REBUILD lại index trên từng đoạn (những đoạn cần phải
REBUILD do có nhiu thao tác xóa, sửa) thay vì trên tn b bảng.
- Nó cũng cho phép nhanh chóng loi bỏ dữ liệu nguyên m
ột đoạn ra khỏi bảng
thay phải dùng lnh DELETE (thao tác này gọi là SWITCH-OUT). Tương
tự nó cũng cho phép “nạp” dữ liệu tmột bảng kc vào tnh một đoạn mới
(SWITCH-IN). Tính năng y rất có giá trị đối với các
ứng dụng ETL (Extract,
Transform & Load) Datawarehouse.
dbạn cần import d liệu của m 2008, bn thể import vào một bảng
riêng sau đó switch-in tức thì bng này vào bng chính. Trước khi có
partitioning, bn phải dùng lệnh INSERT để chuyển dữ liệu tbảng riêng vào
bảng chính. Quá trình y mất nhiều thời gian hơn trong suốt quá trình đó
bảng bị khóa và không th truy cập được.
2. Cải tiến về hiung:
- Khi một u lệnh chỉ cần ly dữ liệu một đoạn nào đó thì h thống chỉ cần
truy nhp o đoạn đó và b qua các đoạn còn lại (tính năng này gọi là
partition elimination)
- Khi các đon dữ liệu được lưu trữ ở các ổ cứng khác nhau sẽ làm giảm tranh
chp vào/ra giữa các câu lệnh. dụ hai câu lnh SELECT và UPDATE hoạt
động trên cùng một bng nhưng hai đoạn khác nhau có thể thực hiện hoàn
toàn song song với nhau.
Vic phân đoạn bảng dựa trên hai ki niệm mới sau đây:
- Partition function: Qui đnh giá trị bn cho các đon. Hệ thống da vàom
này để xác định đoạn mà mỗi bản ghi thuộc o.
- Partition scheme: Ánh xc đoạn khaio trong partition function vào c
filegroup (mỗi đoạn được lưu trữ tại một filegroup).
ới đây tôi sẽ đi qua từng bước thiết lập việc pn đoạn tng qua một d
cụ thể.
Bn có bảng BanHang gồmc cột BangHang_ID, NgayGiaoDich, MaSP,
SoLuong, ThanhTien. Bn muốn phân đoạn bảng theo tng năm của
NgayGiaoDich: Đ
cho đơn gin, giả sử bạn muốn lưu các giao dịch của m
2009 trở về trước vào một đoạn, trong m 2010 vào một đoạn, và t2011 tr
lên o một đoạn (về sau bạn vẫn luôn luôn thể sửa đổi đdành riêng một
đoạn cho 2011 và bsung các đoạn mới cho 2012, 2013). Như vậy vi cấu
hình ở trên, bng sẽ 3 đoạn: 2009 trở v trước, 2010, và 2011 tr về sau. Do
đó bạn cũng cần 3 filegroup.
Bước 1: Tạo database filegroup
CREATE DATABASE PartTest
GO
USE PartTest
GO
-- to filegroup
ALTER DATABASE PartTest ADD FILEGROUP FG2009AndBefore
ALTER DATABASE PartTest ADD FILEGROUP FG2010
ALTER DATABASE PartTest ADD FILEGROUP FG2011AndAfter
-- tm data file o mỗi filegroup
ALTER DATABASE PartTest ADD FILE (NAME = N'FY2009AndBefore',
FILENAME = N'D:\DATA\PartTest\FY2009AndBefore.ndf') TO
FILEGROUP FG2009AndBefore
ALTER DATABASE PartTest ADD FILE (NAME = N'FY2010', FILENAME
= N'D:\DATA\PartTest\FY2010.ndf') TO FILEGROUP FG2010
ALTER DATABASE PartTest ADD FILE (NAME = N'FY2011AndAfter',
FILENAME = N'D:\DATA\PartTest\FY201AndAfter.ndf') TO FILEGROUP
FG2011AndAfter
Bước 2: Tạo partition function và partition scheme
USE PartTest
GO
CREATE PARTITION FUNCTION PFunc_NGD(DATETIME) AS RANGE
RIGHT FOR VALUES ('2010-01-01', '2011-01-01')
GO
CREATE PARTITION SCHEME PScheme_NGD AS PARTITION
PFunc_NGD TO (FG2009AndBefore, FG2010, FG2011AndAfter)
m partition function tên PFunc_NGD đnh nga giá trị biên cho các
đoạn, là ngày đầu tiên củam 2010 và ngày đu tiên của 2011. Giống nh
ư khi
bạn cắt một sợiy, chỉ cần 2 nhát cắt để chia sợi y làm 3 đoạn, đây cũng
chỉ có 2 giá trị biên. Do vy dải giá trị ca các đoạn sẽ như sau:
Đoạn 1: Từ trước đến 2009-12-31 23:59:59
Đoạn 2: 2010-01-01 00:00:00 đến 2010-12-31 23:59:59
Đoạn 3: 2011-01-01 00:00:00 vsau
Sau đó partition scheme PScheme_NGD ng hàm PFunc_NGD đgắn” các
đoạn vào từng filegroup. Như vậy đon 1 sẽ đến FG2009AndBefore, đoạn 2
đến FG2010 và đoạn 3 đến FG2011AndAfter.
Lưu ý, partition function không ging với các user-defined function. Trong
Management Studio, bn thấy partition function và partition scheme mục
Database/Storage.
Một lưu ý nữa là một partition function có thể được dùng cho nhiu partition
scheme, chai là các đối tượng chung trong database chkhông gắn liền với
một bảng cụ thể. Khi định nghĩa bảng (xem bước 4) bạn cần chỉ định dùng
partition schemeo.
Bước 4: Tạo bng dùng partition scheme
USE PartTest
GO
CREATE TABLE dbo.BanHang(
BangHang_ID INT IDENTITY,
NgayGiaoDich DATETIME,
MaSP INT,
SoLuong INT,
ThanhTien INT
) ON PScheme_NGD(NgayGiaoDich)
GO
CREATE CLUSTERED INDEX CI_BanHang_NGD ON
dbo.BanHang(NgayGiaoDich) ON PScheme_NGD(NgayGiaoDich)
Mệnh đề “ON PScheme_NGD(NgayGiaoDich)” trong hai lnh tạo bảng và t
ạo
index trên ch định bảng BanHang và index CI_BanHang_NGD được tạo
trên partition scheme PScheme_NGD, có nghĩađể cho quản lý vic phân
bổ d liệu. Vậy là bảng BanHang đã được pn đoạn. Bạn có thể kim tra xem
dữ liệu được ghi o đoạn nào:
SELECT $PARTITION.PFunc_NGD('2008-07-24')
SELECT $PARTITION.PFunc_NGD('2009-12-31')
SELECT $PARTITION.PFunc_NGD('2010-01-01')
SELECT $PARTITION.PFunc_NGD('2010-11-25')
SELECT $PARTITION.PFunc_NGD('2011-03-16')
Theo PCWorld VN