Professional Documents
Culture Documents
Tối ưu hóa CSDL
Tối ưu hóa CSDL
Các ứng dụng CSDL phân chia công việc thành các giao dịch (transactions). Khi một giao
dịch thực thi, nó sẽ truy cập vào CSDL và thực hiện một số tính toán ở local.
Mỗi giao dịch sẽ thực hiện một cách riêng lẻ - không có hoạt động đồng thời.
Tuy nhiên, các giao dịch của một ứng dụng không đảm bảo diễn ra theo trình tự. Ví dụ: có 2
giao dịch đã được thực hiện xong, nhưng các app khác có thể đã thực hiện giao dịch sửa
đổi dữ liệu trong 1 hoặc 2 giao dịch đầu tiên này.
Vì thế, độ dài của một giao dịch có ý nghĩa quan trọng về tính đúng đắn của nó.
2.2.1 Correctness Considerations (Cân nhắc về tính đúng đắn)
Hai giao dịch được cho là đồng thời nếu các lần thực hiện của chúng có thời gian trùng
nhau. Có nghĩa là, có một số thời điểm mà cả hai giao dịch đã bắt đầu và cả hai giao dịch
đều chưa hoàn thành.
Ví dụ:
Kiểm soát đồng thời, là hoạt động kiểm soát sự tương tác giữa các giao dịch đồng thời. Là
một phương pháp dùng để đảm bảo các giao dịch CSDL được thực hiện một cách an toàn (tức
là không bị mất hay sai lệch dữ liệu)
Một câu hỏi quan trọng là một giao dịch nên kéo dài bao lâu? Điều này rất quan trọng vì độ
dài giao dịch có hai ảnh hưởng đến hiệu suất. Một giao dịch T thực hiện càng lâu thì giao
dịch khác sẽ phải chờ càng lâu nếu bị T chặn.
Do đó, trong các tình huống có thể xảy ra việc chặn, các giao dịch ngắn tốt hơn các giao
dịch dài. Có thể "cắt nhỏ" các giao dịch thành những giao dịch ngắn hơn mà không bị mất
sự đảm bảo cô lập
Làm suy yếu các đảm bảo cô lập một cách cẩn thận
Thông thường, các đảm bảo cô lập suy yếu là đủ. SQL cung cấp các tùy chọn sau:
- Degree0 (): Các lượt đọc có thể truy cập dữ liệu bẩn, tức là dữ liệu được ghi bởi các
giao dịch không được cam kết
- Degree1 (): đọc không cam kết - Các lần đọc có thể đọc dữ liệu bẩn và sẽ không thể
lặp lại. Việc ghi không được ghi đè lên dữ liệu bẩn của các giao dịch khác.
- Degree2 (): đã cam kết đọc - Các lần đọc có thể truy cập dữ liệu đã cam kết
- Degree3 (): có thể tuần tự hóa - Các lần đọc có thể truy cập vào dữ liệu đã cam kết
và các lần đọc có thể lặp lại. Việc ghi không được ghi đè lên dữ liệu bẩn của các
giao dịch khác.
Kiểm soát mức độ chi tiết của khóa
Hầu hết các hệ thống quản lý CSDL hiện đại đều cung cấp các "độ chi tiết" khác nhau của
các ổ khóa.
- Mặc định thường là khóa mức bản ghi (record-level lock)
- Khóa cấp độ trang (page-level lock) sẽ ngăn các giao dịch đồng thời truy cập hoặc
sửa đổi tất cả các bản ghi trên trang đó.
- Khóa cấp bảng (table-level lock) sẽ ngăn các giao dịch đồng thời truy cập hoặc sửa
đổi (tùy thuộc vào loại khóa) tất cả các trang là một phần của bảng đó
Khóa ở cấp độ bản ghi có độ chi tiết tốt hơn so với khóa ở cấp độ trang, chi tiết hóa tốt hơn
so với khóa ở cấp độ bảng.
Các câu lệnh ngôn ngữ định nghĩa dữ liệu (Data definition language (DDL)
statements) có thể có hại
Definition data là thông tin về tên bảng, độ rộng cột, v.v. DDL là ngôn ngữ được sử dụng để
truy cập và thao tác với dữ liệu bảng đó.
Dữ liệu danh mục phải được truy cập bởi mọi giao dịch thực hiện biên dịch, thêm hoặc xóa
bảng, thêm hoặc xóa chỉ mục hoặc thay đổi mô tả thuộc tính.
Vì các danh mục có thể bị chỉnh sửa nhiều lần => tránh cập nhật danh mục hệ thống trong
quá trình hoạt động của hệ thống.
Bởi:
- Một lỗi phần mềm tùy ý có thể chuyển trạng thái cơ sở dữ liệu tốt thành một trạng
thái có lỗi tùy ý.
- Tương tự, đủ lỗi phần cứng có thể khiến dữ liệu bị mất hoặc bị hỏng. Cho điều tốt
nhất hệ thống quản lý cơ sở dữ liệu, sự thật gần hơn nhiều với những điều sau:
Cụ thể, hai loại lỗi phần cứng có thể được chấp nhận:
1. Lỗi dừng fail-stop của bộ xử lý và xóa bộ nhớ truy cập ngẫu nhiên của nó.
(fail-stop có nghĩa là khi bộ xử lý bị lỗi, nó sẽ dừng lại. Trên phần cứng của nhiều
nhà cung cấp chẳng hạn như IBM và HP, mạch kiểm tra dự phòng sẽ dừng bộ xử
lý khi phát hiện thất bại.)
Phục hồi dữ liệu là quy trình tìm kiếm và phục hồi dữ liệu, trong đó có thể có một số rủi ro
không dự đoán trước được vì vậy cần giảm bớt nguy hiểm thấp nhất trong phục hồi dữ liệu:
1. Hiệu quả của các giao dịch đã cam kết phải là vĩnh viễn. Đó là, những thay đổi sẽ
vẫn tồn tại ngay cả sau khi hoàn thành các giao dịch thực hiện những thay đổi đó.
2. Các giao dịch phải là atomic. Đó là, sau khi khôi phục từ phần cứng thất bại, nó có
thể xây dựng lại cơ sở dữ liệu để phản ánh các bản cập nhật của tất cả các giao
dịch đã cam kết (tức là đã hoàn thành thành công). Nó cũng có thể loại bỏ các tác
động của bất kỳ cập nhật nào được thực hiện bằng cách hủy bỏ (còn được gọi là
cuộn lại) hoặc các giao dịch chưa hoàn thành
Để đạt được tới atomic phải dựa vào 2 nguyên tắc đơn giản :
1. . Trước khi cam kết một giao dịch nhất định, phải có khả năng hoàn tác các tác động
của giao dịch đó giao dịch, ngay cả khi bộ nhớ truy cập ngẫu nhiên không thành
công. Điều này ngụ ý rằng những hình ảnh trước của cập nhật của giao dịch (tức là,
giá trị của các mục dữ liệu trước khi giao dịch ghi chúng) phải được lưu trữ ổn định
cho đến thời điểm cam kết. Khi thất bại, họ có thể được ghi vào các đĩa cơ sở dữ
liệu nếu chúng chưa có ở đó.
2. Sau khi giao dịch được cam kết, phải có thể cài đặt các bản cập nhật mà giao dịch
đã được thực hiện vào cơ sở dữ liệu, ngay cả khi bộ nhớ truy cập ngẫu nhiên không
thành công. Vì vậy, hình ảnh sau khi cập nhật giao dịch (nghĩa là giá trị của các mục
dữ liệu giao dịch ghi) phải được ghi vào bộ nhớ ổn định một thời gian trước khi cam
kết thực sự diễn ra. Theo cách đó, nếu có lỗi bất kỳ lúc nào sau khi cơ sở dữ liệu
cam kết diễn ra, có thể "làm lại" tác dụng của các bản cập nhật đó (cài đặt các bản
cập nhật vào cơ sở dữ liệu).
Có bốn cách chính để điều chỉnh hệ thống con khôi phục. Chúng có thể được áp dụng riêng
lẻ hoặc kết hợp.
1. Đặt nhật ký vào đĩa hoặc đĩa chuyên dụng để tránh bị tìm kiếm.
2. Trì hoãn việc ghi cập nhật vào đĩa cơ sở dữ liệu càng lâu càng tốt.
3. Đánh đổi thời gian phục hồi mong muốn với hiệu suất không bị lỗi khi cài đặt điểm kiểm
tra và khoảng kết xuất cơ sở dữ liệu.
4. Giảm kích thước của các giao dịch cập nhật lớn.
2.4 Operating System Considerations (Vinh)
Chữ đỏ là không cần thêm vào slide - dùng để nói :D
Hệ điều hành thực hiện một số chức năng có thể có tác động đáng kể đến
hiệu suất ứng dụng cơ sở dữ liệu.
- Hệ điều hành lập lịch cho các luồng điều khiển. Các vấn đề bao gồm
lượng thời gian cần thiết để lập lịch một luồng mới (càng ít càng tốt);
thời gian của một chuỗi cơ sở dữ liệu (phải dài); và liệu các luồng
khác nhau có nên có các mức độ ưu tiên khác nhau hay không (các
luồng cơ sở dữ liệu đều phải chạy ở cùng một mức độ ưu tiên cho
hầu hết các ứng dụng).
- Hệ điều hành quản lý ánh xạ bộ nhớ ảo và vật lý. Vấn đề là làm thế
nào để tạo ra một phần bộ nhớ ảo được chia sẻ bởi tất cả các luồng
cơ sở dữ liệu, bộ đệm cơ sở dữ liệu và bao nhiêu bộ nhớ truy cập
ngẫu nhiên để dành cho bộ đệm đó.
- Hệ điều hành kiểm soát số lượng luồng người dùng có thể truy cập
đồng thời vào cơ sở dữ liệu. Mục đích là có đủ để chứa những người
dùng có sẵn trong khi tránh bị va chạm.
- Hệ điều hành quản lý các tập tin. Các vấn đề bao gồm liệu các tệp có
thể mở rộng (cần thiết cho cơ sở dữ liệu lớn); liệu các tệp có thể
được tạo từ các phần liền kề của đĩa hay không (hữu ích cho hiệu
suất quét); liệu việc đọc tệp có thể thực hiện lookahead hay không
(cũng hữu ích cho hiệu suất quét)
- Hệ điều hành cung cấp thông tin thời gian. Điều này có thể giúp xác
định xem một ứng dụng bị ràng buộc I / O hay bị ràng buộc bởi bộ xử
lý.
- Hệ điều hành kiểm soát giao tiếp giữa các không gian địa chỉ trên
cùng một trang web (cùng một bộ xử lý hoặc một bộ xử lý khác trong
cùng một bộ đa xử lý bộ nhớ dùng chung) và các không gian địa chỉ
trên các trang khác nhau
Mỗi khi hệ điều hành lên lịch cho một luồng điều khiển khác nhau, nó sẽ
phải trải qua một số tính toán vô ích đối với ứng dụng cơ sở dữ liệu. Do đó,
bộ điều chỉnh cơ sở dữ liệu nên giảm thiểu lượng thời gian dành cho việc
chuyển đổi ngữ cảnh. Có 2 cách để thực hiện.
- Chọn một hệ điều hành có tiện ích chuyển đổi luồng nhẹ
- Giảm thiểu số lần chuyển ngữ cảnh. Việc chuyển đổi là không thể
tránh khỏi khi một ứng dụng đưa ra yêu cầu I / O, nhưng nên tránh
các lý do tùy chọn cho việc chuyển đổi. Điều này có nghĩa là các gián
đoạn theo phân đoạn thời gian sẽ không thường xuyên xảy ra đối với
phần lớn các ứng dụng cơ sở dữ liệu quan tâm chủ yếu đến thông
lượng cao hơn là thời gian phản hồi thấp. Trên các bộ vi xử lý hiện đại
đều cung cấp cho mỗi luồng thời gian 1 giây. Đây là thời gian tính
toán đủ cho hầu hết các ứng dụng và sẽ ngăn hệ thống treo vòng lặp
vô hạn.
Việc lập lịch có liên quan đến các ưu tiên của luồng. Hai quyết định ưu tiên
không tốt sau có thể ảnh hưởng đến hiệu suất cơ sở dữ liệu.
- Hệ thống cơ sở dữ liệu chạy ở mức ưu tiên thấp hơn các ứng dụng
khác. Khi các ứng dụng được ưu tiên tiêu tốn nhiều tài nguyên, các
ứng dụng cơ sở dữ liệu sẽ hoạt động không tốt.
- Hệ điều hành có thể cung cấp cho các chuỗi thực hiện các giao dịch
với mức độ quan trọng lớn hơn mức độ ưu tiên cao hơn. Điều này có
thể phản tác dụng nếu các giao dịch có mức độ ưu tiên khác nhau
truy cập và có thể xung đột trên cùng một mục dữ liệu.
2.4.2 Database Buffer ( Bộ đệm cơ sở dữ liệu)
Bởi vì truy cập vào đĩa mất nhiều thời gian hơn so với truy cập vào RAM, bộ
điều chỉnh cơ sở dữ liệu phải cố gắng giảm thiểu số lần truy cập đĩa. Một
cách để làm điều này là lưu trữ toàn bộ cơ sở dữ liệu trong bộ nhớ trạng
thái rắn (RAM). Điều này là khả thi đối với số lượng ứng dụng ngày càng
tăng.
Mục tiêu của việc điều chỉnh bộ nhớ cho tất cả các ứng dụng khác là để
đảm bảo rằng các trang được đọc thường xuyên hiếm khi yêu cầu quyền
truy cập đĩa.
Mục đích của bộ đệm là giảm số lượng truy cập vật lý vào bộ nhớ thứ cấp
(thường là đĩa). Hình sau cho thấy các thành phần của bộ đệm.
Tác động của bộ đệm lên số lượng truy cập vật lý phụ thuộc vào ba tham
số khác nhau.
- Logical reads and writes : Đây là các trang mà hệ quản trị cơ sở dữ
liệu truy cập thông qua các lệnh đọc và ghi của hệ thống. Một số
trang này sẽ được tìm thấy trong bộ đệm. Một số khác sẽ được dịch
sang đọc và ghi vật lý.
- Database management system (DBMS) page replacements:(Thay
thế trang của hệ thống quản lý cơ sở dữ liệu ): Đây là những lần ghi
vật lý vào bộ nhớ thứ cấp xảy ra khi một trang phải được đưa vào bộ
đệm, không có trang trống và các trang bị chiếm có giá trị dữ liệu
không có trên đĩa cơ sở dữ liệu . Bằng cách giữ cho các đĩa cơ sở dữ
liệu được cập nhật càng nhiều càng tốt thông qua việc sử dụng tính
năng ghi thuận tiện, bộ chỉnh có thể đảm bảo rằng việc thay thế hiếm
khi xảy ra.
- Operating system paging(Phân trang hệ điều hành): Đây là các truy
cập vật lý vào bộ nhớ thứ cấp (trong một số hệ thống, đĩa hoán đổi)
xảy ra khi một phần của không gian đệm nằm bên ngoài RAM. Bộ
điều chỉnh phải đảm bảo rằng việc phân trang như vậy không bao giờ
xảy ra.
Trang được truy cập càng thường xuyên thì việc đưa trang vào bộ nhớ càng
hữu ích. Tương tự, bộ nhớ truy cập ngẫu nhiên ít tốn kém hơn được so sánh
với chi phí truy cập đĩa, thì càng nhiều trang nên được giữ trong bộ nhớ truy
cập ngẫu nhiên.
– Loại RAID này phân chia dữ liệu với bất kỳ số lượng đĩa nào cho phép thông lượng dữ
liệu cao hơn. Các tập tin được đọc từ nhiều đĩa, tăng tốc độ và dung lượng.
– Tuy nhiên nhược điểm là nó không có dự phòng và khả năng chịu lỗi vì dữ liệu không
được lưu lại. Đĩa xuất hiện dưới dạng một phân vùng duy nhất và nếu một phân vùng bị lỗi
thì mảng sẽ bị hỏng và dữ liệu bị mất. RAID 0 được sử dụng khi người dùng cần tốc độ hơn
so với việc dự phòng mất dữ liệu.
RAID 1(Disk Mirroring)
– Cấp RAID này đọc và ghi cùng một dữ liệu vào hai ổ đĩa, nghĩa là nó sẽ có cả cung cấp
dự phòng. Nếu một đĩa bị lỗi, hệ thống vẫn có thể truy cập dữ liệu từ đĩa khác.
– Khi một đĩa bị lỗi được thay thế, dữ liệu được sao chép từ một trong các đĩa còn lại sang
đĩa mới và xây dựng lại mảng. Đây được coi là một cách dễ dàng để tạo lưu trữ failover.
– Tuy nhiên nhược điểm là nó làm giảm một nửa dung lượng có thể sử dụng, RAID 1
được sử dụng khi có sự dư thừa dữ liệu và yêu cầu khả năng dự phòng, tính sẵn sàng là rất
quan trọng.
RAID 5(Striping with parity)
– Loại RAID này chặn các khối dữ liệu trên nhiều đĩa như RAID 0 đồng thời cũng lưu trữ
thông tin (kiểm tra để xác định xem dữ liệu trên đĩa có bất kỳ lỗi nào không và có thể giúp
khôi phục dữ liệu trong trường hợp hỏng đĩa) .
– RAID 5 có cả tốc độ (vì dữ liệu có thể truy cập được từ nhiều đĩa) và dự phòng khi thông
tin được lưu trữ trên các đĩa. Nếu một đĩa bị lỗi, dữ liệu có thể được tạo lại từ dữ liệu trên
các đĩa khác và các khối chẵn lẻ. Khoảng một phần ba dung lượng đĩa được sử dụng trong
việc lưu trữ dữ liệu chẵn lẻ.
– Hạn chế của RAID 5 là nó có hiệu suất thấp hơn vì các máy chủ cần phải thực hiện
nhiều thao tác ghi hơn cho tính chẵn lẻ. Vì vậy RAID 5 thường được dùng cho việc lưu trữ
tập tin và máy chủ ứng dụng.
RAID 10
– Đây là sự kết hợp giữa tính năng phân loại của RAID 0 và RAID 1, nghĩa là vừa có dự
phòng (RAID 1) và hiệu năng tốt hơn của (RAID 0).
– Hạn chế của RAID 10 là khả năng sử dụng thấp và chi phí cao. Khả năng mở rộng cũng
bị hạn chế so với các cấp RAID khác. Do vậy RAID 10 được sử dụng nhiều trong các máy
chủ cơ sở dữ liệu thực hiện nhiều thao tác ghi.
Cách tính dung lượng:
- RAID 0 bằng tổng dung lượng các ổ cộng lại.
- RAID 1 chỉ duy trì dung lượng 1 ổ.
- RAID 5 sẽ có dung lượng ít hơn 1 ổ (5 ổ dùng raid 5 sẽ có dung lượng 4 ổ).
- RAID 10 sẽ chỉ tạo được khi số ổ là chẵn, phải có tối thiểu từ 4 ổ trở lên. Dung lượng bằng
tổng số ổ chia đôi (10 ổ thì dung lượng sử dụng là 5 ổ).
Ví dụ, với 1 loại ổ 1TB:
- Nếu bạn có 2 ổ cứng: Có thể chọn RAID 0 (hỏng 1 ổ là mất dữ liệu), tổng dung lượng khi
cài Window nhìn thấy sẽ là 1 ổ 2TB. Test thử: Rút 1 ổ => Báo lỗi ngay.
- Nếu bạn có 2 ổ cứng: Có thể chọn RAID 1 (hỏng 1 ổ dữ liệu vẫn an toàn), tổng dung lượng
khi cài Window nhìn thấy sẽ là 1 ổ 1TB. Test thử: Rút 1 ổ cứng ra => Không bị lỗi gì.
- Nếu bạn có 4 ổ cứng: Có thể chọn RAID 5 (hỏng 1 ổ dữ liệu vẫn an toàn), tổng dung
lượng khi cài Window nhìn thấy sẽ là 1 ổ 3TB. Test thử: Rút 1 ổ cứng ra => Không bị lỗi gì.
- Nếu bạn có 4 ổ cứng: Có thể chọn RAID 10 (hỏng 2 ổ thuộc 2 cặp RAID khác nhau vẫn an
toàn), tổng dung lượng khi cài Window nhìn thấy sẽ là 1 ổ 2TB. Test thử: Rút 1 ổ cứng ra
=> Không bị lỗi gì.