"Bài giảng Cơ sở dữ liệu nâng cao" trình bày các nội dung lưu trữ và tổ chức tệp tin, lập chỉ mục và băm, tối ưu hóa truy vấn, giao dịch trong cơ sở dữ liệu, điều khiển đồng thời và khôi phục hệ thống. Mời bạn đọc tham khảo.
Trang 1KHOA CÔNG NGHỆ THÔNG TIN
BỘ MÔN HỆ THỐNG THÔNG TIN
-*** -
BÀI GIẢNG
CƠ SỞ DỮ LIỆU NÂNG CAO
TÊN HỌC PHẦN : CƠ SỞ DỮ LIỆU NÂNG CAO
MÃ HỌC PHẦN : 17406
TRÌNH ĐỘ ĐÀO TẠO : ĐẠI HỌC CHÍNH QUY
DÙNG CHO SV NGÀNH: CÔNG NGHỆ THÔNG TIN
HẢI PHÕNG – 2011
Trang 34.2 Các tính chất và trạng thái của giao dịch 33
CHƯƠNG 5: ĐIỀU KHIỂN ĐỒNG THỜI VÀ KHÔI PHỤC HỆ THỐNG 38
5.2 Giao thức thứ tự nhãn thời gian (Timestamp – Ordering protocol) 43
5.3 Phục hồi hệ thống dựa vào nhật ký giao dịch (Log-based) 44
Trang 4Cung cấp cho sinh viên những kiến thức nâng cao về cơ sở dữ liệu quan hệ
Nội dung chủ yếu:
Các vấn đề nâng cao về cơ sở dữ liệu quan hệ: Lưu trữ và tổ chức tệp tin; Lập chỉ mục và băm; Tối ưu hóa truy vấn; Quản lý giao dịch trong cơ sở dữ liệu; Điều khiển tương tranh; Phục hồi hệ thống
Nội dung chi tiết:
TÊN CHƯƠNG MỤC
PHÂN PHỐI SỐ TIẾT
1.1 Tổng quan về phương tiện lưu trữ
3.2 Các phép biến đổi tương đương
3.4 Thuật toán tối ưu hóa cây đại số quan hệ
Chương 4: Giao dịch trong cơ sở dữ liệu (Transactions) 12 6 5 1
4.1 Giới thiệu
4.2 Các tính chất của giao dịch
Trang 54.5 Tính khả tuần tự của lịch biểu (Serializability)
4.6 Thuật toán kiểm tra tính khả tuần tự của lịch biểu
Chương 5: Điều khiển đồng thời và khôi phục hệ thống 12 7 5
5.1 Các giao thức dựa vào khóa (Lock-based)
5.2 Giao thức thứ tự nhãn thời gian
5.3 Phục hồi hệ thống dựa vào nhật ký giao dịch (Log-based)
5.4 Kỹ thuật phân trang bóng (Shadow Paging)
Nhiệm vụ của sinh viên:
Tham dự các buổi học lý thuyết và thực hành, làm các bài tập được giao, làm các bài thi giữa học phần và bài thi kết thúc học phần theo đúng quy định
Tài liệu học tập:
1 Avi Silberschatz, Henry F Korth, S Sudarshan, Database System Concepts, 6th ed, McGraw-Hill
Hình thức và tiêu chuẩn đánh giá sinh viên:
Hình thức thi: tự luận hoặc trắc nghiệm
Tiêu chuẩn đánh giá sinh viên: căn cứ vào sự tham gia học tập của sinh viên trong các buổi học lý thuyết và thực hành, kết quả làm các bài tập được giao, kết quả của các bài thi giữa học phần và bài thi kết thúc học phần
Thang điểm: Thang điểm chữ A, B, C, D, F
Điểm đánh giá học phần: Z = 0,3X + 0,7Y
Bài giảng này là tài liệu chính thức và thống nhất của Bộ môn Hệ thống Thông tin, Khoa Công
nghệ Thông tin và được dùng để giảng dạy cho sinh viên
Ngày phê duyệt: / /
Trang 6liệu Dữ liệu lưu trữ trên Main Memory sẽ mất khi mất nguồn hay lỗi hệ thống
Flash Memory: Khác với Main Memory, dữ liệu lưu trên thiết bị lưu trữ loại này vẫn còn ngay cả khi mất nguồn hay lỗi hệ thống Flash Memory có giá thấp hơn Main Memory, thường sử dụng rộng rãi để lưu trữ dữ liệu trên các thiết bị như camera, máy nghe nhạc, điện thoại, USB,
Magnetic – disk storage: Là phương tiện chủ yếu lưu trữ dữ liệu lâu dài, thường toàn bộ
cơ sở dữ liệu được lưu trữ trên đĩa từ Để xử lý dữ liệu trên đĩa từ, dữ liệu phải được chuyển sang bộ nhớ chính (Main Memory) Hiện nay, dung lượng của đĩa từ có thể từ vài chục Gigabytes đến hàng Terabyte
Optical storage: Các đĩa CD (Compact Disk) với dung lượng khoảng 700 Megabytes là dạng phổ biến nhất của các thiết bị lưu trữ loại này Và khoảng 4.7 đến 8.5 Gigabytes với đĩa DVD (Digital Video Disk) Đĩa hai mặt có dung lượng lên tới 17 Gigabytes Tape storage: Là thiết bị chủ yếu dùng để sao lưu dữ liệu Thiết bị lưu trữ loại này có giá
rẻ hơn đĩa từ nhưng tốc độ truy xuất chậm do phải đọc tuần tự Khả năng lưu trữ của băng từ là rất lớn (40 – 300 Gigabytes)
Các thiết bị lưu trữ được tổ chức như hình sau phân cấp theo tốc độ và giá cả: Ở mức cao là các thiết bị lưu trữ có khả năng truy xuất nhanh hơn nhưng có giá đắt hơn
Trang 7Hình 1.1: Phân cấp các thiết bị lưu trữ
1.2 Tổ chức tệp tin
1.2.1 Bản ghi với độ dài cố định (Fixed – Length Records)
Xem xét các bản ghi trong file instructor, mỗi bản ghi được định nghĩa như sau:
Giả sử mỗi ký tự chiếm một byte và kiểu numeric(8, 2) chiếm 8 bytes như vậy một bản ghi instructor sẽ có độ dài là 53 byte Một cách tiếp cận đơn giản để lưu trữ các bản ghi này là dùng 53 byte đầu tiên lưu bản ghi đầu tiên, 53 byte tiếp theo cho bản ghi thứ hai,
Hình 1.2: File chứa các bản ghi Instructor
Tuy nhiên với các tiếp cận này sẽ có hai vấn đề nảy sinh:
Nếu kích thước của một khối không chia hết cho 53 thì một số bản ghi sẽ vượt quá một khối đĩa, nghĩa là một bản ghi có thể nằm trong hai khối đĩa Như vậy có thể phải truy xuất tới hai khối đĩa để đọc hay ghi một bản ghi
Trang 8Hình 1.3: File Instructor trong hình 1.2 sau khi đã xóa bản ghi thứ 3 và dịch chuyển các bản ghi sau về trước
Với cách tiếp cận này thì khoảng không gian còn trống luôn ở cuối khối, tuy nhiên nhược điểm của nó là phải dịch chuyển một lượng lớn bản ghi để thực hiện thao tác xóa
Một cách tiếp cận đơn giản hơn là di chuyển bản ghi cuối cùng:
Hình 1.4: File Instructor trong hình 1.2 sau khi đã xóa bản ghi thứ 3 và dịch chuyển bản ghi cuối cùng
Sử dụng phương pháp đánh dấu các bản ghi bị xóa:
Thực tế ta không mong muốn phải di chuyển các bản ghi khi thực hiện thao tác xóa, hơn nữa những thao tác thêm một bản ghi được thực hiện thường xuyên hơn những thao tác xóa Do vậy, một cách tiếp cận hợp lý hơn là đánh dấu vị trí các bản ghi bị xóa và chờ thao tác thêm bản ghi tiếp theo sẽ sử dụng lại khoảng không gian bị trống đó
Trang 9Một phương pháp đơn giản để đánh dấu các bản ghi bị xóa là sử dụng một số byte ở phần đầu của tệp tin (ta gọi là file header) để lưu địa chỉ của bản ghi đầu tiên bị xóa, rồi sử dụng bản ghi đầu tiên bị xóa để lưu địa chỉ của bản ghi thứ hai bị xóa, Như vậy ta sẽ có một danh sách các bản ghi được đánh dấu xóa
Hình 1.5: File Instructor trong hình 1.2 với các bản ghi 1, 4, 6 đã đánh dấu xóa
Khi thêm mới một bản ghi, ta sử dụng con trỏ đầu danh sách được chứa trong file header để xác định danh sách, nếu danh sách không rỗng ta xen bản ghi mới vào nơi được trỏ bởi con trỏ đầu danh sách nếu không ta xen bản ghi mới vào cuối file
Ta thấy rằng với cấu trúc bản ghi có độ dài cố định việc cài đặt các thao tác thêm hay xóa bản ghi là đơn giản do khoảng không gian để lại bởi bản ghi bị xóa cũng vừa bằng khoảng không gian cần thiết cho bản ghi thêm vào Nhưng nếu cho phép bản ghi có độ dài thay đổi thì vấn đề trở nên phức tạp hơn nhiều
1.2.2 Bản ghi với độ dài thay đổi (Variable – Length Records)
Lưu trữ nhiều kiểu bản ghi trong một tệp tin
Các kiểu bản ghi với độ dài thay đổi trên một hay nhiều thuộc tính
Các kiểu bản ghi cho phép các trường được lặp lại, như mảng hay tập hợp
Biểu diễn một bản ghi với các thuộc tính có độ dài thay đổi thường gồm hai phần Phần đầu chứa các thuộc tính có độ dài cố định và phần sau là các thuộc tính với độ dài thay đổi Các thuộc tính với độ dài cố định như các giá trị số, ngày tháng, hoặc các xâu với độ dài cố định Các thuộc tính với độ dài thay đổi như các thuộc tính kiểu varchar được biểu diễn với một cặp (offset, length), trong đó offset cho biết vị trí bắt đầu của dữ liệu và length là độ dài (số byte) dữ liệu
Ví dụ với một bản ghi instructor thì các thuộc tính: ID, name và dept_name là các xâu với
độ dài thay đổi, và thuộc tính salary là kiểu số với độ dài cố định Giả sử mỗi giá trị offset và length được lưu trữ trong hai byte và kiểu số được lưu trong 8 byte:
Trang 10null bitmap Trong một số cách biểu diễn, null bitmap được lưu trử ở phần đầu của bản ghi Cách biểu diễn này rất hữu dụng khi số lượng thuộc tính trong một bản ghi, và số lướng thuộc tính null là lớn
Trên đây đã trình bày vấn đề tổ chức các thuộc tính có độ dài thay đổi trong một bản ghi Sau đây ta xem xét vấn đề lưu các bản ghi độ dài thay đổi trong một khối Cấu trúc slotted – page thường được sử dụng để lưu trữ các bản ghi với độ dài thay đổi trong khối đĩa:
Hình 1.7: Cấu trúc Slotted – page
Phần đầu mỗi khối (Block Header) chứa thông tin về:
Số lượng bản ghi
Phần cuối khoảng không gian trống trong khối
Mảng chứa vị trí và kích thước mỗi bản ghi
Các bản ghi được lưu trữ liên tiếp trong khối và bắt đầu từ cuối khối Khoảng khôi gian trống trong khối là liên tiếp nhau và nằm giữa mục cuối cùng trong mảng header và và bản ghi đầu tiên
Khi một bản ghi được thêm vào khối, nó sẽ được lưu ở phần cuối cùng trong không gian trống của khối, sau đó một mục chứa vị trí và kích thước của bản ghi đó sẽ được thêm vào phần Block Header
Nếu một bản ghi bị xóa, khoảng không gian chứa nó sẽ được giải phóng và mục thông tin về bản ghi đó trong phần Block Header sẽ được xóa (ví dụ kích thước được gán bằng -1) Sau đó các
Trang 11bản ghi trước bản ghi bị xóa sẽ được dịch chuyển về cuối để đảm bảo phần không gian trống trong khối luôn nằm giữa Block Header và bản ghi đầu tiên
SQL hỗ trợ các kiểu blob và clob cho các trường hợp mà kích thước dữ liệu cần lưu trữ lớn hơn kích thước của khối đĩa như: ảnh, các tệp tin audio, video, Các kiểu này lưu trữ các đối tượng nhị phân và các chuỗi ký tự lớn Các đối tượng này sẽ được lưu trữ trong các tệp tin đặc biệt và sử dụng cấu trúc cây B+
sẽ được trình bày trong chương sau
1.3 Tổ chức các bản ghi trong tệp tin
Ở phần trước ta đã xem xét làm thế nào để biểu diễn các mẩu tin trong một cấu trúc file Một quan hệ là một tập các bản ghi Với một tập các bản ghi, vấn đề là làm sao để tổ chức chúng trong một file Có một vài cách tổ chức các bản ghi trong file như sau:
Tổ chức tệp tin Heap: Một bản ghi được lưu ở bất kỳ đâu trong file Không có thứ tự của các bản ghi Thông thường một file lưu một quan hệ
Tổ chức tệp tin tuần tự: Các bản ghi được tổ chức tuần tự theo giá trị của một khóa tìm kiếm (search key) trong mỗi bản ghi
Tổ chức tệp tin băm: Sử dụng một hàm băm tính toán trên một số thuộc tính của bản ghi
và dùng kết quả để đó để xác định khối đĩa mà bản ghi được lưu trữ
1.3.1 Tổ chức tệp tin Heap
Là kiểu tổ chức file đơn giản nhất, các bản ghi không được sắp xếp thứ tự Việc thêm mới một bản ghi là đơn giản: Tìm khối đĩa cuối cùng của file, sao chép khối đĩa vào bộ đệm, thêm mới bản ghi rồi ghi lại vào đĩa Địa chỉ của khối đĩa cuối cùng được cập nhật lại vào file header
Do các bản ghi trong file không được sắp xếp theo thứ tự nên khi tìm kiếm phải sử dụng phương pháp tìm kiếm tuần tự: Đọc lần lượt từng khối đĩa vào bộ nhớ chính rồi tiến hành tìm kiếm các bản ghi Như vậy nếu file gồm b khối đĩa thì thời gian tìm kiếm trung bình sẽ là n/2
1.3.2 Tổ chức tệp tin tuần tự
Tổ chức file tuần tự được thiết kế để xử lý hiệu quả các bản ghi theo thứ tự được sắp dựa trên một khoá tìm kiếm nào đó Một khóa tìm kiếm là một hay một nhóm thuộc tính bất kỳ, không nhất thiết phải là khóa chính hay siêu khóa Ta sử dụng kỹ thuật con trỏ để truy xuất nhanh chóng tới bản ghi theo thứ tự khoá tìm kiếm Con trỏ trong mỗi bản ghi sẽ trỏ tới bản ghi tiếp theo trong thứ tự khoá tìm kiếm Hình 1.8 cho thấy tổ chức file tuần tự của các bản ghi instructor với khóa tìm kiếm là thuộc tính ID
Tổ chức file tuần tự cho phép đọc các bản ghi theo thứ tự được sắp thuận lợi cho mục đích hiển thị cũng như cho các thuật toán xử lý truy vấn (query – processing algorithms)
Tuy vậy, kho khăn gặp phải khi tổ chức file tuần tự là việc duy trì thứ tự vật lý của các bản ghi trong file khi xảy ra các thao tác thêm, xóa bản ghi Ta có thể quản lý thao tác xóa nhờ việc sử dụng kỹ thuật con trỏ như đã trình bày ở phần trên Với phép chèn một bản ghi, ta áp dụng các quy tắc sau:
Trang 12Hình 1.8: File tuần tự chứa các bản ghi Instructor
Hình 1.9: File tuần tự sau khi thêm bản ghi vào khối tràn
1.3.3 Tổ chức tệp tin băm
Phương pháp tổ chức file dạng này cho phép truy cập nhanh tới bản ghi cần tìm Điều kiện tìm kiếm phải là điều kiện bằng trên một thuộc tính, gọi là thuộc tính băm (hash attribute, hash field) của file Thông thường thuộc tính đem băm cũng là khóa Ý tưởng của phương pháp này là sử
Trang 13dụng một hàm h nhận giá trị đầu vào là giá trị băm và cho ra kết quả là địa chỉ của khối đĩa chứa bản ghi cần tìm
Ưu điểm của phương pháp tổ chức file dạng này là cho phép thực hiện các thao tác nhanh, tuy vậy việc xây dựng hàm băm là khó khăn vì phải đảm bảo dễ tính toán và phân phối đều các bản ghi
Trang 14ID, Dept_ID là kiểu numberic (8, 2) độ dài cố định, lưu trong 8 byte Name là kiểu varchar(30) độ dài thay đổi lưu, mỗi ký tự, lưu trong 1 byte Age là kiểu số tinyint độ dài cố định, lưu trong 1 byte
Address là kiểu varchar (50) độ dài thay đổi, mỗi ký tự lưu trong 1 byte Hãy biểu diễn bản ghi sau trong cấu trúc bản ghi với độ dài thay đổi:
1002, Nimzowitsch, 102, 60, Russian
1105, Lindan, 111, NULL, China
Trang 15CHƯƠNG 2: LẬP CHỈ MỤC VÀ BĂM 2.1 Các khái niệm cơ bản
Ở chương trước ta đã tìm hiểu về cách thức tổ chức các bản ghi trong file Mỗi phương pháp đều có những ưu, nhược điểm nhất định Chương này sẽ trình bày một số kỹ thuật lập chỉ mục cho phép truy cập hiệu quả tới bản ghi cần tìm dựa vào một giá trị tìm kiếm
Có nhiều kỹ thuật lập chỉ mục và không có kỹ thuật nào là tốt nhất Ta sẽ xem xét các kỹ thuật này thông qua các tiêu chí:
Kiểu truy xuất: Kiểu tìm kiếm mà kỹ thuật lập chỉ mục hỗ trợ: Tìm kiếm với một giá trị
cụ thể hay tìm kiếm với các giá trị trong một khoảng giới hạn
Thời gian truy xuất: Thời gian cần thiết để truy xuất tới một hay một số bản ghi
Thời gian thêm mới một bản ghi: Thời gian cần thiết để thêm mới một bản ghi, bao gồm thời gian thêm bản ghi vào đúng vị trí trong file và thời gian cập nhật lại cấu trúc chỉ mục
Thời gian xóa bản ghi: Thơi gian cần thiết để xóa bản ghi, bao gồm thời gian để tìm, xóa bản ghi và thời gian cập nhật lại cấu trúc chỉ mục
Thường ta muốn trong một file có thể có nhiều hơn một chỉ mục Chẳng hạn, ta muốn tìm kiếm một quyển sách theo nhiều tiêu chí: tác giả, tên sách, chủ đề, Thuộc tính hay một nhóm thuộc tính dùng để tìm kiếm các bản ghi trong file gọi là khóa tìm kiếm (search key – Khái niệm này khác với khái niệm khóa chính, khóa ứng cử hay siêu khóa)
Trang 16Hình 2.1: Chỉ mục chính thiết lập trên trường khóa có thứ tự
Tìm kiếm với điều kiện trên trường khóa: Search (K)
Xác định bản ghi thứ i của file chỉ mục thỏa mãn: Ki ≤ K < Ki+1.
Dựa vào con trỏ Pi trong file chỉ mục đọc khối đĩa chứa bản ghi cần tìm vào bộ đệm và tiến hành tìm kiếm bản ghi
Xét một file dữ liệu có thứ tự với 30000 bản ghi với độ dài cố định là 100 byte và tổ chức theo kiểu không kéo dài (unspanned) được lưu trên đĩa với kích thước khối đĩa là 1024 byte Như vậy một khối đĩa lưu được bfr = 1024 / 100 = 10 bản ghi Do vậy, số khối cần để lưu file dữ liệu là:
b = 30000 / 10 = 3000 khối đĩa Để tìm kiếm một bản ghi có trường khóa là K ta sử dụng phương pháp tìm kiếm nhị phân mất: log2 (b) = log2 (3000) = 12 Giả sử tạo file chỉ mục chính có số bản ghi bằng số khối trong file dữ liệu Mỗi bản ghi gồm 2 trường: trường khóa kích thước 9 byte, kích thước con trỏ là 6 byte thì một bản ghi trong file chỉ mục có độ dài 15 byte Mỗi khối đĩa sẽ lưu
Trang 17được bfri = 1024 / 15 = 68 bản ghi của file chỉ mục Do vậy để lưu file chỉ mục cần bi = 30000 / 68
= 45 khối đĩa Khi đó muốn tìm bản ghi có giá trị khóa K cần: log2 (45) + 1 (truy cập file dữ liệu) =
7 Như vậy rõ ràng nếu có file chỉ mục thì việc tìm kiếm trên trường khóa sẽ nhanh hơn nhiều lần 2.2.2 Chỉ mục cụm (Clustering Indexes)
Nếu các bản ghi trong file dữ liệu được sắp sếp thứ tự trên trường không khóa (không có giá trị duy nhất cho mỗi bản ghi), ta có thể tạo ra một kiểu chỉ mục khác – gọi là chỉ mục cụm – để tăng tốc độ truy xuất tới các bản ghi với điều kiện trên trường không khóa
Hình 2.2: Chỉ mục cụm trên trường không khóa (DeptNumber) có sắp thứ tự
2.2.3 Chỉ mục phụ (Secondary Indexes)
Chỉ mục phụ cung cấp một phương thức để truy cập nhanh tới file dữ liệu trên trường không được sắp thứ tự Chỉ mục phụ có thể áp dụng trên trường khóa ứng cử (có giá trị duy nhất với mỗi bản ghi trong file dữ liệu) hoặc trên trường không khóa (có giá trị giống nhau với những bản ghi khác nhau trong file dữ liệu)
Nếu chỉ mục được thiết lập trên trường khóa không được sắp xếp thì mỗi bản ghi trên file dữ liệu sẽ có tương ứng một bản ghi trong file chỉ mục (Khác với chỉ mục chính: Số bản ghi trong file chỉ mục chính chỉ bằng số khối cần để lưu trữ file dữ liệu) Do vậy chỉ mục phụ cần nhiều không gian lưu trữ và thời gian tìm kiếm hơn so với chỉ mục chính
Trang 18Hình 2.3: Chỉ mục phụ trên trường khóa không sắp thứ tự
Giả sử có một file dữ liệu với r = 30000 bản ghi Các bản ghi có kích thước cố định R = 100 byte Lưu trên đĩa với kích thước khối đĩa là B = 1024 byte Khi đó file dữ liệu sẽ được lưu trong
3000 khối Khi cần tìm kiếm trên một trường không sắp thứ tự:
Nếu không có file chỉ mục phụ: Thực hiện tìm kiếm tuần tự trung bình cần 3000 / 2 =
1500 lần truy cập khối
Nếu tạo một file chỉ mục phụ trên trường cần tìm kiếm kích thước 9 byte, kích thước con trỏ là 6 byte, khi đó kích thước một bản ghi trong file chỉ mục phụ là 15 byte Như vậy một khối đĩa sẽ lưu được 1024 / 15 = 68 bản ghi của file chỉ mục phụ Do chỉ mục được xây dựng trên trường khóa không được sắp thứ tự nên số bản ghi trong file chỉ mục bằng
số bản ghi trong file dữ liệu (như hình trên) Do vậy số khối cần để lưu file chỉ mục phụ là: 30000 / 68 = 442 khối Như vậy để tìm kiếm cần: log2 (442) + 1 (lần truy cập khối đĩa trên file dữ liệu) = 10 lần truy cập khối đĩa
Trang 19Như vậy file chỉ mục phụ là giải pháp hiệu quả để giảm thời gian tìm kiếm trên trường khóa không được sắp xếp
Ta cũng có thể tạo chỉ mục phụ trên trường không khóa Khi đó sẽ có nhiều bản ghi trên file
dữ liệu có cùng giá trị trên trường cần tạo chỉ mục Khi đó giải pháp thông dụng là tạo thêm một file trung gian (giữa file chỉ mục phụ với file dữ liệu) để xử lý các bản ghi có giá trị trùng nhau trên trường tìm kiếm
Hình 2.4: Chỉ mục phụ trên trường không khóa không sắp thứ tự
2.3 Chỉ mục cây B +
2.3.1 Tóm lược về cây tìm kiếm
Cây là một khái niệm trong cấu trúc dữ liệu Cây được tạo thành từ các nút; Mỗi nút trong cây (trừ nút gốc) đều có một nút cha và có thể có hoặc không có nút con Một nút không có nút con nào gọi là nút lá Mức của nút gốc là 0 Mức của nút con = Mức của nút cha + 1
Trang 20Cây tìm kiếm bậc p là một cây mà mỗi nút chứa nhiều nhất p – 1 giá trị tìm kiếm và p con trỏ theo thứ tự: <P1, K1, P2, K2, , Pq-1, Kq-1, Pq> với q ≤ p Mỗi con trỏ Pi trỏ tới một nút con hoặc không trỏ tới nút nào (Null Pointer) Có hai ràng buộc trên cây:
Hình 2.5: Một nút trong cây tìm kiếm với các con trỏ tới cây con
Ta có thể sử dụng cấu trúc cây tìm kiếm để tìm kiếm các bản ghi, các giá trị K trên mỗi là một trường trên file ta gọi là search field (giống khái niệm index field trong file chỉ mục)
2.3.2 Chỉ mục B – Tree
Cấu trúc của B – Tree bậc p:
Mỗi nút trong (internal node) có dạng:
<P1, <K1, Pr1>, P2, <K2, Pr2>, , Pq-1, <Kq-1, Prq-1, Pq>; Trong đó: q ≤ p Pi là một
tree pointer – trỏ tới một nút khác trong cây Pri là một con trỏ dữ liệu (data pointer –
trỏ tới bản ghi có giá trị trên trường khóa tìm kiếm là Ki, hoặc trỏ tới khối đĩa chứa bản ghi đó)
Trang 21Hình 2.6: Một nút trong B – tree với q-1 giá trị tìm kiếm
Trong mỗi nút trong: K1 < K2 < < Kq-1 Với mỗi trường khóa tìm kiếm X trong các cây con được trỏ bởi Pi:
o Ki-1 < X < Ki (1 < i < q)
o X < Ki (i = 1)
o Ki-1 < X (i = q)
Mỗi nút có nhiều nhất p tree pointer
Mỗi nút (trừ nút gốc và nút lá) có ít nhất p/2 tree pointer Nút gốc có ít nhất hai tree
pointer (trừ khi cây chỉ có 1 nút)
Một nút với q (q ≤ p) tree pointer có q-1 khóa tìm kiếm và có q-1 con trỏ dữ liệu
Tất cả các nút lá có cùng mức Nút lá có cấu trúc giống nút trong chỉ khác là trong
nút lá các tree pointer đều có giá trị null (không trỏ tới nút nào khác trong cây)
Hình sau minh họa B – Tree với p = 3:
Hình 2.7: B – tree bậc 3, giá trị chèn vào với thứ tự 8, 5, 1, 7, 3, 12, 9, 6
2.3.3 Chỉ mục B+ – Tree
B+ – Tree là một biến thể của B – Tree Trong B+
– Tree, con trỏ dữ liệu chỉ xuất hiện ở nút
lá Các nút lá thì liên kết với nhau theo thứ tự khóa tìm kiếm, chúng giống như mức đầu tiên trong chỉ mục nhiều mức
Cấu trúc một nút trong (internal node) của B+ – Tree bậc p như sau:
<P1, K1, P2, K2, , Pq-1, Kq-1, Pq>; Trong đó: q ≤ p Pi là một tree pointer – trỏ tới
một nút khác trong cây:
Trang 22o X ≤ Ki (i = 1)
o Ki-1 < X (i = q)
Mỗi nút trong có nhiều nhất p tree pointer
Mỗi nút (trừ nút gốc và nút lá) có ít nhất p/2 tree pointer Nút gốc có ít nhất hai tree
pointer (trừ khi cây chỉ có 1 nút)
Một nút trong với q (q ≤ p) tree pointer có q-1 khóa tìm kiếm
Cấu trúc của một nút lá của B+ – Tree bậc p như sau:
<<K1, Pr1>, <K2, Pr2>, , <Kq-1, Prq-1, Pnext>; Trong đó: q ≤ p Pri là một con trỏ dữ
liệu (data pointer – trỏ tới bản ghi có giá trị trên trường khóa tìm kiếm là Ki, hoặc trỏ tới khối đĩa chứa bản ghi đó) Pnext là một tree pointer – trỏ đến nút lá tiếp theo
trong cây
Trong mỗi nút lá: K1 < K2 < < Kq-1, q ≤ p
Mỗi nút lá có ít nhất p/2 giá trị
Tất cả các nút lá đều có cùng mức
Hình sau minh họa B+
– Tree với p = 3: sau khi chèn: 8, 5, 1, 7, 3, 12, 9, 6
Hình 2.8: B + – tree bậc 3
Trang 232.4 Băm tĩnh và băm động
2.4.1 Băm tĩnh (Static Hashing)
Nhược điểm của tổ chức file tuần tự là phải truy cập tới cấu trúc file chỉ mục để xác định vị trí của bản ghi dữ liệu, hoặc phải thực hiện tìm kiếm nhị phân Khi kích thước file lớn thì kỹ thuật này vẫn sử dụng nhiều thao tác vào ra
Tổ chức file sử dụng kỹ thuật hàm băm sẽ giúp tránh được việc truy xuất tới file chỉ mục
Trong kỹ thuật tổ chức file sử dụng hàm băm, ta sử dụng thuật ngữ bucket để chỉ một đơn vị lưu
trữ, nó có thể lớn hơn hay nhỏ hơn kích thước khối đĩa (disk block) và có thể lưu được một số bản ghi của file dữ liệu Gọi K là tập các giá trị khóa tìm kiếm, B là tập các địa chỉ của các bucket Hàm băm h là hàm ánh xạ một giá trị từ K sang B Bản ghi với khóa tìm kiếm là Ki sẽ được thêm vào bucket có địa chỉ h(Ki) Để tìm kiếm bản ghi với khóa tìm kiếm Ki, ta thực hiện tìm kiếm ở bucket h(Ki)
Hàm băm không chỉ ứng dụng trong việc tổ chức file mà còn có ứng dụng trong việc tạo chỉ mục Khi tạo chỉ mục băm ta áp dụng hàm băm trên trường khóa tìm kiếm để xác định địa chỉ của bucket sau đó lưu giá trị khóa tìm kiếm cùng con trỏ tới bản ghi dữ liệu vào bucket đó Hình sau minh họa chỉ mục băm thứ cấp (secondary hash index) trên file instructor với khóa tìm kiếm là ID Hàm băm trong trường hợp này tính tổng các chữ số của ID đem chia lấy dư cho 8
Hình 2.9: Chỉ mục băm với khóa tìm kiếm là ID trên file Instrutor
Trang 24độ sâu toàn cục (global depth) dùng để xác định địa chỉ của bucket từ giá trị h(K) của khóa tìm kiếm K Ví dụ với gd = 2 thì cần dùng 2 bít sau cùng của h(K) để xác định địa chỉ của bucket Gắn với mỗi bucket là một số ld gọi là độ sâu cục bộ (local depth) - số bit tối thiểu có thể phân biệt các mục trong bucket đó Hình dưới đây minh họa cấu trúc của hàm băm có thể mở rộng với gd = 2 và các ld = 2:
Hình 2.10: Hàm băm có thể mở rộng
Khi muốn tìm một mục dữ liệu với giá trị khóa tìm kiếm là K ta làm như sau:
Tính giá trị của băm h(K)
Biểu diễn h(K) dưới dạng nhị phân
Sử dụng gd bít thấp của h(K) để xác định bucket tương ứng
Xác định vị trí của h(K) trong bucket tìm được và theo con trỏ dữ liệu tới bản ghi dữ liệu cần tìm
Để đơn giản cho việc minh họa, xét hàm băm h(K) = K mod 1000 Lúc này muốn tìm bản ghi với khóa tìm kiếm K = 5 ta làm như sau: Tính h(K) = K mod 1000 = 5 Biểu diễn 5 dưới dạng nhị phân: 101 Sử dụng gd = 2 bít thấp của h(K): 01 xác định được bucket tương ứng là Bucket B Tìm vị trí của 5 trong bucket B và theo con trỏ dữ liệu tới vị trí bản ghi cần tìm trong file dữ liệu
Trang 25Khi muốn thêm một giá trị h(K) ta làm như sau:
Thực hiện tìm kiếm như trên để xác định bucket tương ứng:
Nếu bucket chưa đầy thì chèn h(K) vào bucket đó
Nếu bucket đầy thì thực hiện tách bucket đó ra làm hai và tăng gd lên 1
Hình sau minh họa kết quả sau khi thêm một giá trị h(K) = 13:
Hình 2.11: Cấu trúc hàm băm trong hình 2.10 sau khi thêm h(K) = 13
Hình sau minh họa kết quả sau khi thêm một giá trị h(K) = 20 (Bucket đầy Thực hiện tách):
Hình 2.12: Cấu trúc hàm băm trong hình 2.11 sau khi thêm h(K) = 20
Trang 26File có 50000 bản ghi
Các bản ghi có độ dài cố định 100 byte tổ chức theo kiểu không kéo dài
Trường khóa chính có kích thước 9 byte File được lưu trên đĩa có kích thước khối đĩa là 512 byte Hãy so sánh số lần truy xuất khối đĩa khi thực hiện tìm kiếm trên trường khóa chính trong các trường hợp sau:
File không sắp thứ tự File được sắp thứ tự trên trường khóa chính File được sắp thứ tự trên trường khóa chính và có file chỉ mục chính với kích thước con trỏ là 6 byte
2.5.9 Xét một file dữ liệu với các thông tin như phần 2.6.7 Hãy so sánh số lần truy xuất khối đĩa
khi thực hiện tìm kiếm trên trường khóa ứng cử K trong các trường hợp sau:
File không sắp thứ tự trên trường khóa ứng cử K File không được sắp thứ tự trên trường khóa ứng cử K nhưng có file chỉ mục thiết lập trên trường khóa ứng cử K
2.5.10 Cho B – tree ban đầu rỗng và tập khóa chèn vào theo thứ tự sau: 2, 3, 5, 7, 11, 17, 19, 23,
29, 31 Hãy biểu diễn B – tree bậc:
Trang 272.5.12 Làm lại yêu cầu như phần 2.6.9 và 2.6.10 với cấu trúc B+ – tree
2.5.13 Giả sử có một cấu trúc hàm băm có thể mở rộng (Extendable Hashing) trên file chứa các bản
ghi với trường khóa tìm kiếm K như sau: 2, 3, 5, 7, 11, 17, 19, 23, 29, 31 Hãy chỉ ra cấu trúc của hàm băm cho file này nếu hàm băm là: h(x) = x mod 8 và mỗi buket có thể chứa được 3 bản ghi
2.5.14 Chỉ ra cấu trúc hàm băm có thể mở rộng ở phần 2.6.12 sau mỗi thao tác dưới đây:
Delete 11
Delete 31
Insert 1
Insert 15
Trang 28vấn được viết bằng ngôn ngữ nào
o Bộ kiểm tra: Kiểm tra cú pháp của truy vấn xem có hợp lệ hay không
o Xác nhận tính hợp lệ (các quan hệ, thuộc tính sử dụng trong truy vấn đã được khai báo hay chưa? Sau bước 1 truy vấn sẽ được biểu diễn bằng một biểu thức đại số quan hệ)
Bước 2:
o Bộ tối ưu: Tìm ra phương pháp thực hiện tối ưu cho truy vấn
o Sau bước này sẽ cho ra một biểu thức đại số quan hệ với chi phí thực hiện nhỏ nhất Bước 3:
o Bộ tạo mã sẽ tạo ra chương trình bằng ngôn ngữ trong để thực hiện truy vấn
o Thực thi chương trình để lấy về kết quả
3.2 Các phép biến đổi tương đương
Các truy vấn được viết bằng các ngôn ngữ bậc cao, ví dụ SQL, sau bước 1 của quá trình xử
lý truy vấn, truy vấn được biểu diễn bằng biểu thức đại số quan hệ Ví dụ:
Trang 29Một số phép biến đổi tương đương:
o Tách điều kiện trong phép chọn:
o Tính chất giao hoán của phép chọn:
o Dãy các phép chiếu liên tiếp:
o Phép chọn – phép tích đề các và phép kết nối :
o Tính chất giao hoán của phép kết nối :
o Tính chất giao hoán của phép kết nối tự nhiên:
o Tính chất kết hợp của phép kết nối tự nhiên:
o Tính chất kết hợp của phép kết nối :
thuộc và
o Phép chọn và phép kết nối :
, các thuộc tính trong 2 chỉ thuộc
o Phép chiếu và phép kết nối :
Các thuộc tính trong chỉ thuộc
Các thuộc tính trong chỉ thuộc
Các thuộc tính trong đều có trong và
Các thuộc tính trong chỉ thuộc
Các thuộc tính trong chỉ thuộc
Các thuộc tính trong chỉ có trong , liên quan đến nhưng không
Trang 30 Tính chất phân phối của phép chọn qua phép hợp – giao – trừ:
Tính chất phân phối của phép chiếu qua phép hợp:
3.3 Thuật toán tối ƣu hóa cây đại số quan hệ
Xét hai bảng nhân viên và đơn vị sau:
NhanVien (MaNV, MasoDV, HoTen, NgaySinh, GioiTinh, Luong)
DonVi(MaDV, TenDV)
Truy vấn đưa ra họ tên của các nhân viên nữ ở đơn vị có tên là „PhongDaoTao‟: