thiết kế và thc thi CSDL Sql Server
. Như đã trình bày các bài trước mt trong nhng đặc đim ca SQL Server
2000 là Multiple-Instance nên khi nói đến mt (SQL) Server nào đó là ta nói đến
mt Instance ca SQL Server 2000, thông thường đó là Default Instance.
Mt Instance ca SQL Server 2000 có 4 system databases và mt hay nhiu user database. Các
system databases bao gm:
Cu Trúc Ca SQL Server
Như đã trình bày các bài trước mt trong nhng đặc đim ca SQL Server 2000 là Multiple-
Instance nên khi nói đến mt (SQL) Server nào đó là ta nói đến mt Instance ca SQL Server
2000, thông thường đó là Default Instance. Mt Instance ca SQL Server 2000 có 4 system
databases và mt hay nhiu user database. Các system databases bao gm:
Master : Cha tt c nhng thông tin cp h thng (system-level information) bao gm
thông tin v các database khác trong h thng như v trí ca các data files, các login
account và các thiết đặt cu hình h thng ca SQL Server (system configuration
settings).
Tempdb : Cha tt c nhng table hay stored procedure được tm thi to ra trong quá
trình làm vic bi user hay do bn thân SQL Server engine. Các table hay stored
procedure này s biến mt khi khi động li SQL Server hay khi ta disconnect.
Model : Database này đóng vai trò như mt bng km (template) cho các database khác.
Nghĩa là khi mt user database được to ra thì SQL Server s copy toàn b các system
objects (tables, stored procedures...) t Model database sang database mi va to.
Msdb : Database này được SQL Server Agent s dng để hoch định các báo động và các
công vic cn làm (schedule alerts and jobs).
Cu Trúc Vt Lý Ca Mt SQL Server Database
Mi mt database trong SQL Server đều cha ít nht mt data file chính (primary), có th
thêm mt hay nhiu data file ph (Secondary) và mt transaction log file.
Primary data file (thường có phn m rng .mdf) : đây là file chính cha data và nhng
system tables.
Secondary data file (thường có phn m rng .ndf) : đây là file ph thường ch s dng
khi database được phân chia để cha trên nhiu dĩa.
Transaction log file (thường có phn m rng .ldf) : đây là file ghi li tt c nhng thay
đổi din ra trong mt database và cha đầy đủ thông tin để có th roll back hay roll
forward khi cn.
Data trong SQL Server được cha thành tng Page 8KB và 8 page liên tc to thành mt Extent.
Trước khi SQL Server mun lưu data vào mt table nó cn phi dành riêng mt khong trng
trong data file cho table đó. Nhng khong trng đó chính là các extents. Có 2 loi Extents:
Mixed Extents (loi hn hp) dùng để cha data ca nhiu tables trong cùng mt Extent và
Uniform Extent (loi thun nht) dùng để cha data ca mt table. Ðu tiên SQL Server dành
các Page trong Mixed Extent để cha data cho mt table sau đó khi data tăng trưởng thì SQL
dành hn mt Uniform Extent cho table đó.
Nguyên Tc Hot Ðng Ca Transaction Log Trong SQL Server
Transaction log file trong SQL Server dùng để ghi li các thay đổi xy ra trong database. Quá
trình này din ra như sau: đầu tiên khi có mt s thay đổi data như Insert, Update, Delete được
yêu cu t các ng dng, SQL Server s ti (load) data page tương ng lên memory (vùng b
nh này gi là data cache), sau đó data trong data cache được thay đổi(nhng trang b thay đổi
còn gi là dirty-page). Tiếp theo mi s thay đổi đều được ghi vào transaction log file cho nên
người ta gi là write-ahead log. Cui cùng thì mt quá trình gi là Check Point Process s kim
tra và viết tt c nhng transaction đã được commited (hoàn tt) vào dĩa cng (flushing the
page).
Ngoài Check Point Process nhng dirty-page còn được đưa vào dĩa bi mt Lazy writer. Ðây là
mt anh chàng làm vic âm thm ch thc gic và quét qua phn data cache theo mt chu k nht
định sau đó li ng yên ch ln quét ti.
Xin gii thích thêm mt chút v khái nim transaction trong database. Mt transaction hay mt
giao dch là mt lot các hot động xy ra được xem như mt công vic đơn (unit of work) nghĩa
là hoc thành công toàn b hoc không làm gì c (all or nothing). Sau đây là mt ví d c đin v
transaction:
Chúng ta mun chuyn mt s tin $500 t account A sang
account B như vy công vic này cn làm các bước sau:
1. Tr $500 t account A
2. Cng $500 vào account B
Tuy nhiên vic chuyn tin trên phi được thc hin dưới dng mt transaction nghĩa là giao
dch ch được
xem là hoàn tt (commited) khi c hai bước trên đều thc hin thành công. Nếu vì mt lý do nào
đó ta ch
có th thc hin được bước 1 (chng hn như va xong bước 1 thì đin cúp hay máy b treo) thì
xem như giao
dch không hoàn tt và cn phi được phc hi li trng thái ban đầu (roll back).
Thế thì Check Point Process hot động như thế nào để có th đảm bo mt transaction được thc
thi mà không làm "dơ" database.
Trong hình v trên, mt transaction được biu din bng mt mũi tên. Trc nm ngang là trc
thi gian. Gi s mt Check Point được đánh du vào thi đim gia transaction 2 và 3 như hình
v và sau đó s c xãy ra trước khi gp mt Check point kế tiếp. Như vy khi SQL Server được
restart nó s da trên nhng gì ghi trong transaction log file để phc hi data (xem hình v).
Ðiu đó có nghĩa là SQL Server s không cn làm gì c đối vi transaction 1 vì ti thi đim
Check point data đã được lưu vào dĩa ri. Trong khi đó transaction 2 và 4 s được roll forward vì
tuy đã được commited nhưng do s c xy ra trước thi đim check point kế tiếp nên data chưa
kp lưu vào dĩa. Tc là da trên nhng thông tin được ghi trên log file SQL Server hoàn toàn có
đầy đủ cơ s để viết vào dĩa cng. Còn transaction 3 và 5 thì chưa được commited (do b down
bt ng) cho nên SQL Server s roll back hai transaction này da trên nhng gì được ghi trên log
file.
Cu Trúc Logic Ca Mt SQL Server Database
Hu như mi th trong SQL Server được t chc thành nhng objects ví d như tables, views,
stored procedures, indexes, constraints.... Nhng system objects trong SQL Server thường có bt
đầu bng ch sys hay sp. Các objects trên s được nghiên cu ln lượt trong các bài sau do đó
trong phn này chúng ta ch bàn sơ qua mt s system object thông dng trong SQL Server
database mà thôi.
Mt s Sytem objects thường dùng:
System Stored Procedure ng dng
Sp_help ['object'] Cung cp thông tin v mt database object (table, view...) hay
mt data type.
Sp_helpdb ['database'] Cung cp thông tin v mt database c th nào đó.
Sp_monitor Cho biết độ bn rn ca SQL Server
Sp_spaceused ['object',
'updateusage' ]
Cung cp thông tin v các khong trng đã được s dng cho
mt object nào đó
Sp_who ['login'] Cho biết thông tin v mt SQL Server user
Ví d:
sp_helpdb 'Northwind' s cho kết qu có dng như bng dưới đây
name db_size owner dbid created status .....
---------------------------------------------------------------------------------------------------------------------
----------- -------
Northwind 3.94 MB sa 6 Aug 6 2000 Status=ONLINE,
Updateability=READ_WRITE, .....
stored procedure sp_spaceused như ví d sau
USE Northwind
Go
sp_spaceused 'Customers'
s cho biết thông tin v table Customer:
name rows reserved data index_size unused
------------------------------------- ------------------------------------------
Customers 91 104 KB 24 KB 80 KB 0 KB
To Mt User Database
Chúng ta có th to mt database d dàng dùng SQL Server Enterprise bng cách right-click lên
trên "database" và chn "New Database".
Sau đó chúng ta ch vic đánh tên ca database và click OK.
Ngoài ra đôi khi chúng ta cũng dùng SQL script để to mt database. Khi đó ta phi ch rõ v trí
ca primary data file và transaction log file.
Ví d:
USE master
GO
CREATE DATABASE Products
ON
( NAME = prods_dat,
FILENAME = 'c:\program files\microsoft SQL server\mssql\data\prods.mdf',
SIZE = 4,
MAXSIZE = 10,
FILEGROWTH = 1
)
GO
Trong ví d trên ta to mt database tên là Products vi logical file name là prods_dat và
physical file name là prods.mdf, kích thước ban đầu là 4 MB và data file s t động tăng lên mi
ln 1 MB cho ti ti đa là 10 MB. Nếu ta không ch định mt transaction log file thì SQL s t
động to ra 1 log file vi kích thước ban đầu là 1 MB.
Lưu Ý:
Khi to ra mt database chúng ta cũng phi lưu ý mt s đim sau: Ði vi các h thng nh
đó vn đề tc độ ca server không thuc loi nhy cm thì chúng ta thường chn các giá tr
mc định (default) cho Initial size, Automatically growth file. Nhưng trên mt s production
server ca các h thng ln kích thước ca database phi được người DBA ước lượng trước tùy
theo tm c ca business, và thông thường người ta không chn Autogrowth(t động tăng
trưởng) và Autoshrink(t động nén). Câu hi được đặt ra đây là vì sao ta không để SQL Server
chn mt giá tr khi đầu cho datafile và sau đó khi cn thì nó s t động ni rng ra mà li phi
ước lượng trước? Nguyên nhân là nếu chn Autogrowth (hay Autoshrink) thì chúng ta có th s
gp 2 vn đề sau:
Performance hit: nh hưởng đáng k đến kh năng làm vic ca SQL Server. Do nó phi
thường xuyên kim tra xem có đủ khong trng cn thiết hay không và nếu không đủ
s phi m rng bng cách dành thêm khong trng t dĩa cng và chính quá trình này s
làm chm đi hot động ca SQL Server.
Disk fragmentation : Vic m rng trên cũng s làm cho data không được liên tc mà
cha nhiu nơi khác nhau trong dĩa cng điu này cũng gây nh hưởng lên tc độ làm
vic ca SQL Server.
Trong các h thng ln người ta có th d đoán trước kích thước ca database bng cách tính
toán kích thước ca các tables, đây cũng ch là kích thước ước đoán mà thôi (xin xem
"Estimating the size of a database" trong SQL Books Online để biết thêm v cách tính) và sau đó
thường xuyên dùng mt s câu lnh SQL (thường dùng các câu lnh bt đầu bng DBCC .Phn
này s được bàn qua trong các bài sau) kim tra xem có đủ khong trng hay không nếu không
đủ ta có th chn mt thi đim mà SQL server ít bn rn nht (như ban đêm hay sau gi làm
vic) để ni rng data file như thế s không làm nh hưởng ti performance ca Server.
Chú ý gi s ta dành sn 2 GB cho datafile, khi dùng Window Explorer để xem ta s thy kích
thước ca file là 2 GB nhưng data thc tế có th ch chiếm vài chc MB mà thôi.
Nhng Ðim Cn Lưu Ý Khi Thiết Kế Mt Database
Trong phm vi bài này chúng ta không th nói sâu v lý thuyết thiết kế database mà ch đưa ra
mt vài li khuyên mà bn nên tuân theo khi thiết kế.
Trước hết bn phi nm vng v các loi data type. Ví d bn phi biết rõ s khác bit gia
char(10), nchar(10) varchar(10), nvarchar(10). Loi d liu Char là mt loi string có kích thước
c định nghĩa là trong ví d trên nếu data đưa vào "This is a really long character string" (ln
hơn 10 ký t) thì SQL Server s t động ct phn đuôi và ta ch còn "This is a". Tương t nếu
string đưa vào nh hơn 10 thì SQL s thêm khong trng vào phía sau cho đủ 10 ký t. Ngược
li loi varchar s không thêm các khong trng phía sau khi string đưa vào ít hơn 10. Còn loi
data bt đầu bng ch n cha d liu dng unicode.
Mt lưu ý khác là trong SQL Server ta có các loi Integer như : tinyint, smallint, int, bigint.
Trong đó kích thước tng loi tương ng là 1,2,4,8 bytes. Nghĩa là loi smallint tương đương vi
Integer và loi int tương đương vi Long trong VB.
Khi thiết kế table nên:
Có ít nht mt ct thuc loi ID dùng để xác định mt record d dàng.
Ch cha data ca mt entity (mt thc th)